在 macOS 上落地 OpenClaw 的团队常遇到同一类问题:网关在终端里跑得好好的,一旦加上定时刷新、webhook 重试,或运维执行 gateway restart,agent 就悄悄停了。根因往往不在「多写几行 crontab」,而是没有按苹果推荐的方式配置 LaunchAgent、标准输出日志与进程边界。租一台可 SSH 的云 Mac mini 做预发,能以按天计的成本反复改 plist,又不必让笔记本每二十分钟睡眠打断后台任务。
OpenClaw 用 LaunchAgent 还是 cron
macOS 仍带 crontab,但官方调度核心是 launchd。以登录用户加载的 LaunchAgent 能继承图形会话相关的环境变量,对依赖 HOME、SSH agent socket 或 ~/.config 下配置的 OpenClaw 更友好。cron 环境极简,常见故障是「终端里一切正常,每到第 12 分钟就失败」,排障会议一开就是三刻钟。
夜间审计、缓存预热、令牌轮换等重复任务,请用 ~/Library/LaunchAgents/ 下的 plist,配合 StartCalendarInterval 或 StartInterval。Ventura 及以后推荐 launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.example.openclaw.health.plist 加载;老文档里的 launchctl load 仍有人用,但新资料更强调 bootstrap 语义。
若你通过 npm 或 Docker 部署 OpenClaw,调度层不变:plist 只负责调用包装脚本,再由脚本指向正确二进制。安装路径与升级节奏可先读 OpenClaw npm 与 Docker 部署对比,再写死到 plist 里,避免日后升级 Node 时 silent break。
plist 里真正影响稳定性的键
三类键决定「能演示」与「能长期跑」的差别:
- StandardOutPath / StandardErrorPath — 不设就等于盲飞。建议写到
~/Library/Logs/OpenClaw/,按周轮转或限制单文件 50 MB,防止占满启动盘。 - RunAtLoad — 登录即拉起;与 KeepAlive 联用可自动重启,但过于激进会在坏配置下形成崩溃循环,试验阶段给
ThrottleInterval至少 10 秒。 - EnvironmentVariables — 显式写
NODE_ENV、PATH(Apple Silicon 别忘了/opt/homebrew/bin)以及 OpenClaw 配置目录覆盖项。指望「继承终端环境」在 launchd 下不可靠。
包装脚本需 shebang 且 chmod +x。launchd 不会像某些 cron 配置那样替你猜默认 shell。
排障时可 launchctl kickstart -k gui/$(id -u)/com.example.openclaw.health 强制重启,再 tail StandardError;配合 log show --predicate 'process == \"launchd\"' --last 15m 看退出原因——代码 78 多表示配置错误,高频重启多半缺依赖。
共享云主机上勿把生产 API 令牌明文写进全局可读 plist;若外包人员曾登录,合并后应轮换密钥。更稳妥是由密钥系统在启动时注入短期令牌,或为敏感任务单独建 macOS 用户与独立 LaunchAgents 目录。
网关重启与依赖任务
发布时执行 gateway restart,若包装脚本里写 pkill -f openclaw 这类宽匹配,可能把健康检查或其他 LaunchAgent 拉起的子进程一并干掉。应缩小信号范围,或优先使用官方 CLI 提供的停启钩子。运维手册建议固定三步:排空 webhook、重启网关、用 launchctl print gui/$(id -u)/com.example.openclaw.gateway 核对上次退出码。
两个 cron/LaunchAgent 若在同一分钟调用 npm exec 抢同一端口,失败者往往无声退出。把计划错开 120 秒,或用 /tmp 下的锁文件加 flock 串行化。
系统小版本升级后记得重新 launchctl print 关键 label:苹果偶尔会收紧默认资源上限,原本 256 个文件描述符够用的网关,升级后可能要在包装脚本里先 ulimit -n 1024 再启动 Node。
对外暴露——回环绑定、反向代理、隧道——请参考 OpenClaw 网关、代理与隧道加固,避免调度器在错误网络面上反复重启。
为什么云 Mac 胜过常睡眠的笔记本
笔记本会睡眠、VPN 会闪断,电源策略还会暂停后台任务。数据中心里的 Mac mini M4 可长期在线,出口 IP 稳定便于加白名单,需要点 macOS 隐私弹窗时还能开 VNC。按日租金大约 17–25 美元 的短峰,比为峰值单独采购硬件更灵活。
先把 SSH、屏幕共享与账号首次登录流程按 远程 Mac 配置指南 跑通,再批量加载 LaunchAgent;否则容易出现 plist 以错误用户运行、找不到密钥链条目等问题。
监控可另起一个 LaunchAgent,每 5 分钟 用十几行 curl 打网关健康检查,连续三次延迟超过 800 毫秒 再告警,能在用户感知 webhook 延迟前发现 Node 事件循环卡死。
跨时区团队要在 plist 里写清 StartCalendarInterval 的 Hour/Minute 对应机器本地时区,并在 runbook 写明 UTC 偏移;否则「午夜任务」可能在错误自然日触发,和按日滚动的幂等键冲突,造成重复投递。
使用 nvm 时 plist 内请写 Node 绝对路径,如 /Users/builder/.nvm/versions/node/v22.14.0/bin/node,因为非交互 launchd 不会 source .zshrc。README 里锁定 Node 版本,升级时同事才记得同步改 plist。
日志与 webhook 载荷若未轮转,聊天型 bot 一个月可能涨 2–4 GB。可每周用 LaunchAgent 删除 ~/Library/Logs/OpenClaw/archive/ 里超过 14 天 的 gzip,或接入集中日志满足合规留存。
快速决策表
| 需求 | 推荐 | 注意 |
|---|---|---|
| 用户会话、钥匙串、GUI 令牌 | LaunchAgent | 登录项顺序、FileVault 解锁时机 |
| 绑定特权端口(<1024) | LaunchDaemon + 权限收敛 | 与用户 LaunchAgent 混用要谨慎 |
| 一次性每小时脚本 | cron 或 at | PATH 与时区陷阱 |
| 网关崩溃自恢复 | LaunchAgent + ThrottleInterval | 坏发布导致重启风暴 |
常见问题
OpenClaw 在 macOS 上应用 cron 还是 LaunchAgent?
用户态常驻任务优先 LaunchAgent:launchd 对崩溃重启、环境变量继承与日志比现代 macOS 上的 cron 更可预期。临时试验或已有 crontab 的老脚本可继续用 cron。
为什么 gateway restart 会让 agent 掉线?
重启网关时若包装脚本使用过于宽泛的 pkill,或与子进程共享同一进程组,可能一并结束健康检查等 LaunchAgent 任务。应拆分 plist 标签、写清日志,并避免只按进程名全局杀进程。
7×24 节点要预留多少内存?
在 Node 堆之外至少预留 4 GB 应对 30 秒内多次 webhook 尖峰。16 GB 的 Apple Silicon Mac mini 适合预发;生产网关常见做法是独立机器。
可靠的 agent 需要可靠的主机。Apple Silicon Mac mini 租赁提供原生 macOS 调度、稳定供电与 SSH/VNC,无需再为峰值单独买台式机。当 OpenClaw 网关要在夜间任务与 webhook 突发中保持温热,把负载放到云端节点、把笔记本留给写代码,并按发布节奏弹性增减租用天数,是 2026 年更现实的运维路径。
让 OpenClaw 在真 macOS 上持续在线
租用云 Mac mini,7×24 运行 LaunchAgent、预发网关与 Safari 相关工作流。先选区域,再完成 SSH 加固后加载 plist。