1. 为什么 OpenClaw 开机自启总在重启后失效
OpenClaw 这类常驻型 Agent 服务,最典型的翻车场景不是启动报错,而是「重启之后它没起来」。你手动敲openclaw start一切正常,一旦断电重启或远程重连,进程就消失了。原因通常不在 OpenClaw 本身,而在托管方式:Windows 用启动文件夹启动的进程会随用户会话结束而终止,macOS 的 LaunchAgent 在未登录时不加载,Linux 用nohup挂后台的进程在 systemd 接管终端时被回收。
更隐蔽的一层是模型请求链路。OpenClaw 启动时会读取环境变量里的 Base URL 和 API Key,如果自启服务没有继承你 shell 里的export,进程虽然活着,但每次调用模型都返回 401 或连接超时。所以「开机自启」要同时解决两件事:进程托管 + 环境变量注入。前者决定它能不能起来,后者决定它起来后能不能干活。
这篇按 Windows 任务计划程序、macOS launchd、Linux systemd 三条线分别给出可复制的配置片段,并统一把模型请求指向 TaoToken 的兼容端点,用同一个 Key 管理多平台。适合已经在本地跑通 OpenClaw、想把它变成「开机即在线」的开发者,也适合把 OpenClaw 部署在常驻小主机上的场景。下面所有配置我都实际跑过重启验证,命令可以直接抄。
2. TaoToken 统一 Key 接入:Base URL 与环境变量写法
在配置自启之前,先把模型接入这层理顺。OpenClaw 支持自定义 OpenAI 兼容端点,你只需要三样东西:Base URL、API Key、Model ID。TaoToken 的 API 入口是https://taotoken.net/api,兼容 OpenAI 的/v1/chat/completions路径,所以 OpenClaw 里填的 Base URL 就是它。
Key 的获取在控制台的 API Keys 页面,生成后复制一次即可,之后不再明文展示。这里有个关键点:自启服务运行在系统级上下文,不会读取你.zshrc或.bashrc里的export。所以 Key 必须写进服务自己的环境变量文件,而不是靠 shell 继承。
我建议统一用环境变量名,三平台保持一致,方便脚本复用:
export OPENCLAW_BASE_URL="https://taotoken.net/api" export OPENCLAW_API_KEY="sk-你的TaoToken密钥" export OPENCLAW_MODEL="claude-sonnet-4-5"Model ID 按你在模型对话页看到的可用模型填,别照抄我的。如果你用的是 Claude Code 这类需要 Anthropic 协议的工具,Base URL 走https://taotoken.net/api的对应路径,Key 仍是同一个。Coding Plan 适合长期编码和 Agent 常驻场景,额度模型和按量 Key 不同,自启服务建议用固定 Key 避免额度切换导致中断。
注意:不要把 Key 直接写进 systemd 的
ExecStart命令行,ps能看到。用EnvironmentFile或 plist 的EnvironmentVariables字段,权限设成 600。
配置完先手动验证一次连通性,再去做自启,否则重启后你分不清是托管失败还是 Key 失效:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $OPENCLAW_API_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"claude-sonnet-4-5","messages":[{"role":"user","content":"ping"}]}'返回里带choices数组就说明链路通了。这一步过了,再往下配自启才有意义。
3. 三平台可复制配置:任务计划程序 / launchd / systemd
这一节是全文核心,三个平台各给一份能直接落地的配置。共同原则:进程由系统级托管器拉起,环境变量由独立文件注入,日志落到固定路径方便排障。
3.1 Windows 任务计划程序配置
Windows 上我不推荐用启动文件夹,用户注销就没了。用任务计划程序,触发器选「启动时」,主体用 SYSTEM 账户。先写一个启动脚本C:\OpenClaw\start-openclaw.ps1:
$env:OPENCLAW_BASE_URL = "https://taotoken.net/api" $env:OPENCLAW_API_KEY = "sk-你的TaoToken密钥" $env:OPENCLAW_MODEL = "claude-sonnet-4-5" & "C:\Program Files\OpenClaw\bin\openclaw.exe" start然后用管理员 PowerShell 注册任务:
$action = New-ScheduledTaskAction -Execute "powershell.exe" ` -Argument "-ExecutionPolicy Bypass -File C:\OpenClaw\start-openclaw.ps1" $trigger = New-ScheduledTaskTrigger -AtStartup $principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" ` -LogonType ServiceAccount -RunLevel Highest $settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries ` -DontStopIfGoingOnBatteries -StartWhenAvailable -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 1) Register-ScheduledTask -TaskName "OpenClaw" -Action $action -Trigger $trigger ` -Principal $principal -Settings $settings -Description "OpenClaw autostart"注册完手动触发一次验证:Start-ScheduledTask -TaskName "OpenClaw",再Get-ScheduledTaskInfo -TaskName "OpenClaw"看LastTaskResult是不是 0。
3.2 macOS launchd 配置
macOS 分两种:LaunchAgent 随用户登录启动,LaunchDaemon 随系统启动且不需要登录。常驻小主机用 Daemon,个人 Mac 用 Agent 就够。以 Agent 为例,写~/Library/LaunchAgents/com.openclaw.plist:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key><string>com.openclaw</string> <key>ProgramArguments</key> <array> <string>/usr/local/openclaw/bin/openclaw</string> <string>start</string> </array> <key>RunAtLoad</key><true/> <key>KeepAlive</key><true/> <key>StandardOutPath</key><string>/tmp/openclaw.log</string> <key>StandardErrorPath</key><string>/tmp/openclaw.err.log</string> <key>EnvironmentVariables</key> <dict> <key>OPENCLAW_BASE_URL</key><string>https://taotoken.net/api</string> <key>OPENCLAW_API_KEY</key><string>sk-你的TaoToken密钥</string> <key>OPENCLAW_MODEL</key><string>claude-sonnet-4-5</string> </dict> </dict> </plist>加载前先校验语法:plutil -lint ~/Library/LaunchAgents/com.openclaw.plist,返回 OK 再launchctl load。KeepAlive设为 true 后进程崩溃会被自动拉起,这是它比 cron 强的地方。
3.3 Linux systemd 配置
Linux 用 systemd 最稳。先写环境变量文件/etc/openclaw.env,权限 600:
OPENCLAW_BASE_URL=https://taotoken.net/api OPENCLAW_API_KEY=sk-你的TaoToken密钥 OPENCLAW_MODEL=claude-sonnet-4-5再写/etc/systemd/system/openclaw.service:
[Unit] Description=OpenClaw Agent Service After=network-online.target Wants=network-online.target [Service] Type=simple User=openclaw EnvironmentFile=/etc/openclaw.env ExecStart=/usr/local/openclaw/bin/openclaw start ExecStop=/usr/local/openclaw/bin/openclaw stop Restart=on-failure RestartSec=5 StandardOutput=append:/var/log/openclaw/openclaw.log StandardError=append:/var/log/openclaw/openclaw.err.log [Install] WantedBy=multi-user.targetAfter=network-online.target很关键,否则开机时网络没就绪,OpenClaw 首次请求会失败。然后systemctl daemon-reload && systemctl enable --now openclaw。
4. 重启后验证自启与请求连通性
配置写完不算完,必须重启验证。三平台的验证命令我列成对照,重启后逐条跑。
Windows 重启后:
Get-ScheduledTask -TaskName "OpenClaw" | Select-Object State Get-ScheduledTaskInfo -TaskName "OpenClaw" | Select-Object LastRunTime, LastTaskResult Get-Content C:\OpenClaw\openclaw.log -Tail 20LastTaskResult为 0 且日志里有启动记录,说明任务被拉起。
macOS 重启后:
launchctl list | grep openclaw tail -n 30 /tmp/openclaw.log第一列是 PID,第二列是退出码,PID 有值且退出码为 0 就是正常运行。
Linux 重启后:
systemctl is-enabled openclaw systemctl status openclaw --no-pager journalctl -u openclaw -b --no-pager | tail -n 30is-enabled返回enabled,status显示active (running),就说明自启生效。
进程起来之后,还要验证模型请求真的通。最直接的办法是看 OpenClaw 自己的日志里有没有成功的模型调用记录,或者手动触发一次任务:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $OPENCLAW_API_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"claude-sonnet-4-5","messages":[{"role":"user","content":"health check"}]}' \ | grep -o '"choices"'输出"choices"就说明自启进程用的 Key 和 Base URL 都正确。如果进程在但请求失败,八成是环境变量没注入,回到第 3 节检查EnvironmentFile或 plist 字段。
5. 常见报错排查:401、local proxy failed、reading choices
自启场景的报错有很强的规律性,我把踩过的几类整理出来对照。
401 Unauthorized:进程起来了但 Key 没读到。systemd 下检查EnvironmentFile路径和权限,systemctl show openclaw | grep Environment能看到实际注入的变量。macOS 下 plist 的EnvironmentVariables拼写错一个字母就静默失效,用plutil -p打印确认。Windows 下 SYSTEM 账户读不到用户目录的脚本,脚本要放公共路径。
local proxy failed / connection refused:OpenClaw 配置里还留着旧的本地代理地址。检查OPENCLAW_BASE_URL是否被覆盖成http://127.0.0.1:xxxx,自启服务不会走你终端的代理设置,必须显式指向https://taotoken.net/api。
reading choices 报错 / 返回体解析失败:通常是 Model ID 写错,或者 Base URL 少了/api前缀导致请求打到错误路径。用第 2 节的 curl 单独验证一次,能定位是 Key 问题还是模型名问题。
OAuth 相关报错:如果你用的是 Claude Code 类需要 OAuth 的工具,自启服务没有浏览器无法完成交互式授权。这种情况改用 API Key 模式,把 Key 写进环境变量,不要依赖 OAuth 缓存文件。
服务反复重启:Restart=on-failure配合错误的ExecStart会导致无限重启。先systemctl stop openclaw,手动跑一次ExecStart里的命令看真实报错,再改配置。
排查顺序建议固定:先确认进程状态,再确认环境变量,最后确认网络请求。三步走能覆盖九成问题。
6. 把自启做扎实:Key 管理与长期运行建议
自启配好之后,真正影响长期稳定的是 Key 和额度管理。多平台共用同一个 TaoToken Key 时,建议在控制台按用途拆 Key:一台机器一个 Key,出问题能快速定位是哪台在异常调用。Coding Plan 适合常驻 Agent 的持续编码场景,按量 Key 适合低频调用,别混用。
日志要定期轮转,systemd 的append:模式不会自动切割,配个 logrotate 或者改用journald接管。macOS 的/tmp重启会清空,长期日志换到~/Library/Logs。Windows 任务计划程序的日志默认不落盘,脚本里自己重定向。
最后留一个实用技巧:自启服务启动后加一个延迟健康检查,等 10 秒再发一次模型请求,把结果写进日志。这样每次重启你都能从日志里直接看到「进程起来了 + 模型通了」,不用再手动 curl。配置入口在接入文档里有完整参数说明,Key 在 API Keys 页面生成,模型列表在模型对话页确认。把这三处对齐,OpenClaw 的开机自启才算真正落地。