1. 为什么 Windows 下 OpenClaw 开机自启总是失败
很多人第一次在 Windows 上部署 OpenClaw,都会经历一个非常相似的场景:当天晚上跑通了,飞书、Telegram 或者本地控制台都能正常对话,关机睡觉。第二天早上起来发消息,没有任何反应,打开电脑一看,OpenClaw 根本没起来。
这个问题的根源其实不在 OpenClaw 本身,而在于 Windows 和 WSL 的启动机制是两套独立体系。OpenClaw 的网关服务跑在 WSL 的 Linux 用户空间里,而 Windows 开机登录时并不会自动帮你把 WSL 里的用户级 systemd 服务拉起来。你手动打开 WSL 终端时它看起来是好的,是因为终端会话触发了用户服务;一旦没有交互式终端,服务就处于「装了但没跑」的状态。
所以完整的开机自启链路要拆成两段:第一段是在 WSL 内部让 OpenClaw 网关成为可持续运行的用户服务,第二段是在 Windows 侧用 PowerShell 注册一个登录时触发的任务,把 WSL 拉起来并启动这个服务。两段都做对,重启后才能真正无人值守。
这篇内容适合已经在 Windows 上装好 WSL 和 OpenClaw、但被自启动问题卡住的用户,也适合准备把 OpenClaw 当长期在线助手来用的人。下面我会给出可复制的 config.toml 与 settings.json 骨架、启动脚本片段,以及重启后验证自启动是否生效的具体检查动作。整个过程中,TaoToken 作为统一的 Key/API 通道接入,省去你在多个模型供应商之间来回切换配置的麻烦。
2. TaoToken 前置:统一 Key 与 API 通道
在配置自启动之前,先把模型通道这件事定下来。OpenClaw 支持多种模型后端,如果你每个模型都单独配一套 Key,config.toml 会变得很难维护,自启动脚本里也容易漏掉环境变量。TaoToken 的思路是提供一个统一的 API 入口,你只需要在配置里写一个 base_url 和一个 Key,就能调用多个模型。
TaoToken 官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api 。注意 API 地址不带 UTM 参数,配置里直接写这个就行。
你需要先拿到一个 API Key。登录后进入控制台,在 API Keys 页面创建一个新的 Key,复制保存好。这个 Key 后面会写进 OpenClaw 的 config.toml,也会作为环境变量传给 WSL 里的服务。
注意:API Key 属于敏感信息,不要直接提交到 Git 仓库,也不要在公开的启动脚本里明文硬编码。建议放在 WSL 用户目录下的环境文件里,通过 systemd 的 EnvironmentFile 加载。
如果你还没创建 Key,可以走这个路径:先访问 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 创建,再回到 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 查看用量和余额。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,里面有各语言的调用示例,配置 OpenClaw 时对照着看即可。
3. 可复制配置:config.toml 与 settings.json 骨架
3.1 WSL 内 OpenClaw 的 config.toml
OpenClaw 的配置文件通常位于~/.config/openclaw/config.toml。下面是一个接入 TaoToken 的最小骨架,你可以直接复制后替换 Key:
# ~/.config/openclaw/config.toml [gateway] host = "0.0.0.0" port = 18789 log_level = "info" [model] provider = "openai-compatible" base_url = "https://taotoken.net/api" api_key = "${TAOTOKEN_API_KEY}" default_model = "claude-sonnet-4-20250514" [model.fallback] enabled = true models = ["gpt-4o", "claude-sonnet-4-20250514"] [channels.feishu] enabled = true app_id = "your_feishu_app_id" app_secret = "your_feishu_app_secret"这里的关键点是base_url指向 TaoToken 的 API 入口,api_key用环境变量占位,避免明文。default_model可以按你实际使用的模型名填写,fallback 列表用于主模型不可用时自动切换。
3.2 环境变量文件
在 WSL 里创建~/.config/openclaw/env:
TAOTOKEN_API_KEY=sk-你的实际Key然后设置权限,防止其他用户读取:
chmod 600 ~/.config/openclaw/env3.3 systemd 用户服务单元
OpenClaw 网关需要作为用户级 systemd 服务运行。创建~/.config/systemd/user/openclaw-gateway.service:
[Unit] Description=OpenClaw Gateway After=network-online.target Wants=network-online.target [Service] Type=simple EnvironmentFile=%h/.config/openclaw/env ExecStart=/usr/local/bin/openclaw gateway run Restart=on-failure RestartSec=5 [Install] WantedBy=default.target注意ExecStart的路径要和你实际安装 OpenClaw 的位置一致,可以用which openclaw确认。
3.4 Windows 侧 PowerShell 启动脚本
在 Windows 上创建一个启动脚本,比如C:\Scripts\start-openclaw.ps1:
# C:\Scripts\start-openclaw.ps1 $distro = "Ubuntu" $service = "openclaw-gateway" wsl.exe -d $distro --bash -lc "systemctl --user start $service" Start-Sleep -Seconds 3 wsl.exe -d $distro --bash -lc "systemctl --user is-active $service"这个脚本的作用是:登录时拉起 WSL,启动用户服务,然后检查服务状态。如果你用的不是 Ubuntu,把$distro改成wsl -l里显示的名称。
3.5 注册计划任务
以管理员身份打开 PowerShell,执行:
$action = New-ScheduledTaskAction -Execute "powershell.exe" ` -Argument "-NoProfile -WindowStyle Hidden -File C:\Scripts\start-openclaw.ps1" $trigger = New-ScheduledTaskTrigger -AtLogOn $settings = New-ScheduledTaskSettingsSet ` -ExecutionTimeLimit (New-TimeSpan -Hours 0) ` -RestartCount 3 ` -RestartInterval (New-TimeSpan -Minutes 1) ` -AllowStartIfOnBatteries ` -DontStopIfGoingOnBatteries Register-ScheduledTask ` -TaskName "OpenClaw_AutoStart" ` -Action $action ` -Trigger $trigger ` -Settings $settings ` -RunLevel Highest ` -Force执行成功后会看到任务状态为 Ready。这里用 PowerShell 脚本包一层,比直接在计划任务里写wsl.exe参数更可控,也方便后续加日志。
4. 验证请求与成功结果
配置完成后,先不要急着重启,在 WSL 里手动验证一遍服务链路。
第一步,启用 linger,让用户服务在终端关闭后继续运行:
sudo loginctl enable-linger "$(whoami)"第二步,重新加载 systemd 并启动服务:
systemctl --user daemon-reload systemctl --user enable --now openclaw-gateway第三步,查看状态:
systemctl --user status openclaw-gateway看到active (running)就说明 WSL 内部这一层没问题了。
第四步,在 Windows 浏览器访问http://localhost:18789,能打开 OpenClaw 控制台就说明网关正常。
第五步,手动运行一次 PowerShell 脚本:
powershell.exe -NoProfile -File C:\Scripts\start-openclaw.ps1如果输出active,说明 Windows 侧调用链路也通了。
最后重启电脑,登录后等 30 秒左右,再次访问http://localhost:18789。如果控制台能打开,并且通过飞书发消息有响应,就说明开机自启完整生效了。
如果你想先验证模型通道是否正常,可以打开模型对话页面 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 发一条测试消息,确认 Key 和模型都可用,再回头排查自启动问题,能少走很多弯路。
5. 本篇常见错排查
5.1 重启后服务没起来,手动打开 WSL 就好了
这是最典型的现象。原因是 linger 没开,或者 systemd 用户服务没有 enable。检查:
loginctl show-user "$(whoami)" | grep Linger如果显示Linger=no,重新执行sudo loginctl enable-linger "$(whoami)"。
5.2 计划任务显示已运行,但服务还是没起
大概率是 WSL 发行版名称写错了。用wsl -l -v查看准确名称,注意大小写。另外,计划任务里如果用了--bash -lc,要确保命令在非交互式 shell 下也能找到systemctl。可以在脚本里加绝对路径,或者先source ~/.bashrc。
5.3 端口 18789 被占用
检查 Windows 侧是否有其他程序占用了这个端口:
netstat -ano | findstr 18789如果有冲突,改 config.toml 里的port,同时更新验证地址。
5.4 API Key 读取不到
systemd 的 EnvironmentFile 不会自动展开 shell 变量。确认 env 文件里是TAOTOKEN_API_KEY=sk-xxx这种纯键值对格式,不要加export,也不要用引号包裹。改完后执行:
systemctl --user daemon-reload systemctl --user restart openclaw-gateway5.5 飞书消息没响应但控制台能打开
这说明网关起来了,但渠道配置有问题。检查 config.toml 里[channels.feishu]的 app_id 和 app_secret 是否正确,以及飞书后台的事件订阅地址是否指向你的公网入口。如果只是本地测试,可以先用控制台里的对话功能验证模型通道。
5.6 计划任务执行超时被终止
默认计划任务有执行时间限制。上面注册时用了-ExecutionTimeLimit (New-TimeSpan -Hours 0)表示不限制。如果你手动创建任务,记得在「设置」里把「如果任务运行时间超过以下时间,停止任务」取消勾选。
6. 长期运行与 Coding Plan 接入
如果你打算把 OpenClaw 当作长期在线的编码助手或 Agent 来用,建议把模型通道固定到 Coding Plan 上。Coding Plan 针对代码场景做了优化,长上下文和工具调用的稳定性更好,适合 OpenClaw 这种需要持续处理任务的环境。
接入方式很简单,在 config.toml 里把default_model换成 Coding Plan 支持的模型,base_url 仍然用https://taotoken.net/api。如果你还没开通,可以先到 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 了解套餐内容,再决定是否切换。
对于 Claude Code 这类工具的重度用户,TaoToken 也提供了对应的接入方式,参考 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 里的 ClaudeCodeAnthropic 章节即可。配置逻辑和 OpenClaw 一致,都是统一 base_url 加 Key。
最后提醒一个实操细节:每次修改 config.toml 或 env 文件后,都要执行systemctl --user daemon-reload再 restart,否则 systemd 不会重新读取环境变量。这个坑我在调试阶段踩过好几次,服务状态显示 running,但实际用的还是旧 Key,排查了半天才发现是没 reload。