我家里那台 Mac mini,本来只是当备用电脑用,后来被改造成常驻服务器,专门跑 OpenClaw 这个开源自动化任务服务,负责定时执行脚本、做消息归类和日常任务调度。最初几天我发现一个特别恼人的现象:明明已经把系统的“睡眠”选项关了,第二天来看任务还是停在半路,日志显示进程在半夜某个时间点突然失联。反复折腾了好几个晚上,我才把所有影响因素理清楚——默认电源策略、系统休眠参数、开机自启、断电恢复,每一环都可能让 OpenClaw 在你不注意的瞬间断掉。
这篇不是科普文档,就是我实际配置 Mac mini 24 小时不休眠运行 OpenClaw 的完整记录。包括 pmset 参数怎么调、LaunchAgent 怎么写才能让它开机自动跑、以及连续运行几个月后踩到的坑。照着操作,你也能把一台普通 Mac mini 变成真正意义上的小型常驻服务器。
1. 先分清 macOS 的几种“睡眠”:为什么改了设置还是会被打断
很多人对“不让 Mac 休眠”这件事的理解,停留在系统设置里“防止自动睡眠”这个开关上。实际上 macOS 的电源管理远比一个勾选项复杂,它管着 CPU 休眠、硬盘休眠、网络唤醒、Power Nap 等多个独立机制。OpenClaw 这种常驻服务,很可能在同一台机器上同时被好几套策略打断。
我举个例子:只把“关闭显示器”的时间调成永不,系统依然可能在凌晨进入真正的内存睡眠(sleep);即使关掉了系统睡眠,硬盘也可能在一段时间无读写后休眠(disksleep),某些服务访问磁盘时反而会触发异常;连了外部存储设备时,磁盘卸载和睡眠还会叠加处理。这些策略之间互相独立,必须分别关掉。
macOS 查看电源策略的统一入口是 pmset 命令。用它可以看到当前所有和电源相关的参数,这也是后面所有调整的基础。
### 1.1 pmset 基础概念与关键参数
pmset 的全称是 Power Management Settings,在 macOS 上可以通过它在命令行里查看和修改电源管理参数。先看一下当前真实生效的策略:
pmset -g输出会按当前供电方式分组显示,比如 Ac Power(接电源)、Battery(电池)或 UPS。对 Mac mini 来说,绝大多数时间走的是 Ac Power 这一组。里面那些参数,按我整理的经验,可以分成三类:
| 参数 | 作用 | 对 7×24 运行的影响 |
|---|---|---|
| sleep | 系统整体睡眠等待时间 | 最关键,值为 0 表示禁止睡眠 |
| disksleep | 硬盘进入休眠的时间 | 建议同样设为 0,避免偶发唤醒异常 |
| womp | Wake on Magic Packet,网络唤醒 | 不一定要开,看你的远程访问需求 |
| powernap | 睡眠时是否允许后台唤醒做备份等 | 建议关掉,它会让系统在睡眠边缘反复横跳 |
| tcpkeepalive | 是否保持 TCP 连接活跃 | 有助于远程连接时网络不断开 |
| disablesleep | 强制禁用睡眠(台式机) | Apple Silicon 桌面机通常可用,注意别在笔记本上乱开 |
初次看到这一堆参数不要慌,关键是分清哪些是“让人睡着的”,哪些是“睡着了还偷偷干活”的。OpenClaw 被打断,通常是第一种;而偶尔会遇到日志里出现“wake from sleep”记录,多半是 powernap 在捣乱。
### 1.2 修改前先备份当前电源策略
改电源策略之前,我强烈建议先把当前策略完整备份一份。原因很现实:不同 macOS 版本、不同芯片平台的默认参数其实不同,万一你调错了,或者后续系统更新把策略重置,至少能知道原始状态长什么样。
备份命令很简单:
pmset -g custom > ~/Desktop/pmset-backup-$(date +%Y%m%d).txt把这份文件留着,等于给电源设置拍了一张快照。后面要是发现某次调整后系统不稳定,拿它对照,能快速判断是哪一项导致的。
2. 用 pmset 一次性关掉系统睡眠与磁盘休眠
这一节直接给出我用下来最终有效的命令。Mac mini 24 小时不休眠运行 OpenClaw,核心就是把系统睡眠和硬盘休眠同时关掉,否则任何一个都可能中断任务。
先说明一下,pmset 修改的是系统级电源策略,修改需要管理员权限。所有命令执行完以后立即生效,不需要重启,但建议都执行完后用查询命令再确认一遍。
### 2.1 核心命令:sleep 和 disksleep 设为 0
打开终端,依次执行:
sudo pmset -a sleep 0 sudo pmset -a disksleep 0 sudo pmset -a powernap 0这里解释一下每个参数我为什么这么设。
sleep 0:把系统进入内存睡眠的等待时间设为 0,也就是禁止。这是最关键的一步,OpenClaw 进程不会被系统挂起。disksleep 0:禁止硬盘自动休眠。这一步很多人忽略,但如果你的 Mac mini 接了外部存储,或者 OpenClaw 偶尔要读写数据库文件,硬盘休眠再唤醒可能带来随机延迟,严重时会让任务超时。powernap 0:关闭电源小憩机制。这个机制的本意是系统睡眠时还能定时醒来检查邮件、同步数据,但常驻服务根本不需要睡眠,所以建议直接关掉,避免系统在“睡了”和“醒着”之间反复切换。
另外,如果希望系统崩溃后能自动唤醒继续干活,可以开启网络唤醒参数。不过这一步不是必须的,我后面会单独讲网络唤醒的取舍。
### 2.2 台式机专属参数:disablesleep
如果确认当前机器是 Mac mini,可以再额外设置一个参数:
sudo pmset -a disablesleep 1这个参数的作用是彻底禁用睡眠机制。注意它仅适用于台式机类设备,对 MacBook 这类带电池的设备不可用,设置后可能导致合盖不睡眠、发热失控。所以这条命令不要盲目抄到笔记本上。
设置完以后,再用pmset -g查看,正常情况下sleep和disksleep都会显示为 0。如果你是在 Apple Silicon 的 Mac mini 上执行,注意观察输出里是否有disablesleep 1,如果没有,多数是系统版本对桌面机参数展示方式做了调整,并不是没生效。
### 2.3 验证是否真正生效
配置完成后,强烈建议做一次“断电式”验证:把显示器关掉,等十几分钟,再用另一台设备去 ping 或者 SSH 登录这台 Mac mini,看是否始终在线。如果 OpenClaw 自带日志,直接观察日志时间线是否连续。
我当初验证时用了一个更接地气的方法:在 OpenClaw 里放了一个每分钟执行一次的心跳任务,把这个任务的输出时间戳和pmset -g的当前状态做比对。如果心跳中断了,说明仍有睡眠开关没有完全关闭。这个方法既能验证电源配置,也能顺便监测服务是否存活,后面我会在这个思路基础上扩展出完整的自检方案。
3. 用 LaunchAgent 把 OpenClaw 变成开机自启常驻进程
电源问题解决后,OpenClaw 至少不会在半夜睡着了。但马上遇到第二个问题:万一机器重启了、进程崩溃了,谁来替我把服务拉起来?macOS 上很多人第一时间想到的是“系统设置 - 登录项”,把 OpenClaw 加到开机启动列表里。这个方案能用,但不推荐长期依赖,因为登录项依赖用户登录会话,且进程崩溃后不会自动重启。
正确的做法是给 OpenClaw 写一个 LaunchAgent 配置文件,交给 launchd 管理。launchd 是 macOS 原生的服务管理框架,支持开机自启、崩溃自动重启、日志重定向,这几样刚好都是常驻服务需要的。
### 3.1 为什么选择 LaunchAgent 而不是登录项
我一开始图省事,直接在登录项里加了 OpenClaw。跑了一段时间发现问题很多:首先是开机到登录界面之前,OpenClaw 不会启动;其次如果某次系统更新后需要重新登录,服务会处于一种“半启动”状态;最难受的是,进程一旦因为网络波动退出,没有任何机制把它拉起来,第二天只能手动再开。
LaunchAgent 完全不同。它由 launchd 统一管理,通常在用户登录前就可以加载,不受图形界面状态影响。配置里的 KeepAlive 选项可以做到“进程死了立刻拉起”,这才是“7×24 常驻”该有的样子。
### 3.2 一个可以直接用的 plist 模板
下面是我目前一直在用的 LaunchAgent 配置。请根据自己的实际路径调整ProgramArguments里的命令位置,比如有些安装方式可能把 OpenClaw 放在/opt/homebrew/bin/openclaw,有些在~/.local/bin/openclaw。
创建文件~/Library/LaunchAgents/local.openclaw.service.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>local.openclaw.service</string> <key>ProgramArguments</key> <array> <string>/usr/local/bin/openclaw</string> <string>serve</string> </array> <key>WorkingDirectory</key> <string>/Users/你的用户名/openclaw</string> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <dict> <key>SuccessfulExit</key> <false/> <key>Crashed</key> <true/> </dict> <key>StandardOutPath</key> <string>/tmp/openclaw.stdout.log</string> <key>StandardErrorPath</key> <string>/tmp/openclaw.stderr.log</string> </dict> </plist>解释一下几个关键配置的含义:
RunAtLoad:加载这个 LaunchAgent 时立即启动 OpenClaw,配合开机自启使用。KeepAlive:这是常驻的核心。Crashed为 true 表示如果进程崩了就重新拉起;SuccessfulExit为 false 表示即使进程正常退出,也不会因此停止守护,等于无论如何都要保证 OpenClaw 处于运行状态。StandardOutPath和StandardErrorPath:把进程的标准输出和标准错误重定向到日志文件,方便后续排查问题,这一点对长期运行至关重要。
### 3.3 加载调试与开机自启的常见问题
写完 plist 后,先检查格式是否正确,然后加载到 launchd:
plutil -lint ~/Library/LaunchAgents/local.openclaw.service.plist launchctl load ~/Library/LaunchAgents/local.openclaw.service.plist如果在较新的 macOS 上load命令提示已废弃,可以改用:
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/local.openclaw.service.plist这里我踩过一个很隐蔽的坑:如果 OpenClaw 的可执行文件没有绝对路径,或者 WorkingDirectory 目录不存在,launchd 会启动失败,但终端没有任何明显报错。这时要看日志,也就是/tmp/openclaw.stderr.log,一般会有明确提示。另一种方式是查看 launchd 记录的进程状态:
launchctl print gui/$(id -u)/local.openclaw.service看到state = running就说明一切正常。
重启一下 Mac mini,登录后打开活动监视器,确认 OpenClaw 进程已经自动出现,说明开机自启已经配置成功。到这个阶段,Mac mini 不休眠并且 OpenClaw 能常驻运行的基础已经成型,但离真正稳定跑几个月,还差最后一环:应对网络异常、断电和系统更新。
4. 真正影响 7×24 运行的还有这些:网络、断电、系统更新
把睡眠和自启搞定后,我天真地以为万事大吉,结果后面又折腾了两周。OpenClaw 任务断掉的原因,不一定都是系统休眠,还有三件事非常容易被忽视:网络连接不稳、意外断电、系统更新把电源策略偷偷重置。
### 4.1 网络固化:有线连接与 DHCP 保留
Mac mini 同时支持 Wi-Fi 和有线以太网。跑常驻服务,我强烈建议用有线连接。原因很简单:Wi-Fi 会休眠、会切换热点、会受到路由器策略影响,一旦无线信号波动,局域网内 SSH 都可能断开。而 OpenClaw 如果依赖网络拉取数据或对外提供接口,Wi-Fi 的小抖动都会反映在服务日志里。
网络层面具体做两件事。
第一,创建一个固定使用的网络位置,或者至少在路由器上设置 DHCP 保留,让 Mac mini 每次拿到的内网 IP 不变。这样 OpenClaw 配置里的回调地址、终端地址可以不依赖动态 IP。
第二,检查 Mac mini 是否开启了“无线网络唤醒”或“局域网唤醒”。这个功能的初衷是允许其他设备通过网络唤醒这台机器,但对于常驻服务而言,它有时反而会干扰电源策略。如果平时只需要靠 SSH 主动连进来,可以把它关掉,避免系统因为一个唤醒包而临时改变工作状态。
### 4.2 断电恢复与自动开机设置
一年里难免会遇到一两次意外断电。断电后电源恢复时,Mac mini 会不会自动开机,直接影响服务能否“无人值守”恢复。这需要在系统的节能设置里找“断电后自动启动”相关选项。不同 macOS 版本入口可能不太一样,一般位于“系统设置 - 能源”或“节能”下,找到类似 “Start up automatically after a power failure” 的选项并勾选。
如果没有这个选项(部分新机型可能隐藏),可以试试命令:
sudo pmset -a autorestart 1设置好后,可以做一个简单测试:把 Mac mini 电源断开再插上,观察是否自动开机。这里提醒一句,如果家里电压不稳定,建议给 Mac mini 配一个基础 UPS。不是为了撑几小时,而是为了在断电瞬间给系统一个正常的关机或待机时间,避免磁盘损坏。
### 4.3 系统更新后电源策略可能被重置
这是我踩过最无语的坑:一次 macOS 小版本更新后,OpenClaw 又在半夜断了。排查到最后发现,系统更新不仅重启了机器,还把电源策略恢复成了默认,导致 sleep 参数回到 10 分钟。所以,长期运行 OpenClaw 的机器,在大版本和小版本更新之后,一定要主动检查一次电源策略。
你可以把检查命令写成一个简单脚本,更新后跑一遍,或者干脆定期执行:
#!/bin/bash # 检查关键电源参数是否被重置 pmset -g | grep -E "sleep|disksleep|powernap"配合 OpenClaw 的心跳日志,如果发现哪个环节有问题,就能快速定位。我目前的做法是合并成一条命令,每次更新完系统都手动跑一遍,顺便确认 LaunchAgent 是否还在加载状态,两分钟就能完成例行体检。
5. 连续运行几个月后的避坑记录
把这套配置跑通之后,我的 Mac mini 已经连续稳定运行了好几个月,OpenClaw 中间没再因为睡眠或自启问题中断过。不过长期运行总会暴露一些新问题,这里把我遇到的和朋友遇到的坑整理一下,作为避坑记录。
### 5.1 日志与磁盘占用:别让小文件慢慢占满硬盘
LaunchAgent 配置里如果不做日志轮转,OpenClaw 的 stdout 和 stderr 日志会一直增长。尤其是 OpenClaw 这类自动化任务服务,如果某个任务出错,每秒钟可能产生大量重复错误日志,用不了一个月就能积累几十 GB,磁盘满后服务反而会异常退出。
我的处理方案是周期性清理日志,或者用 macOS 自带的 newsyslog 做日志轮转。简单做法是写一个定时清理命令放进 crontab,保留最近 5 天的日志:
find /tmp/openclaw.stdout.log /tmp/openclaw.stderr.log -mtime +5 -delete虽然这类日志文件在/tmp重启后会自动清理,但对常驻机器来说,重启频率很低,所以定期清理是必要的。更稳妥的思路是把日志路径改到/var/log/openclaw/,再用 newsyslog 配置轮转。
### 5.2 散热与摆放:Mac mini 长期开机的真实状态
Mac mini 的散热设计比笔记本好,很多人误以为它可以完全不管。实际上如果把它塞在封闭的抽屉、电视柜角落,或者周围堆满杂物,长期跑 OpenClaw 的负载会让机身温度明显升高。我这边环境比较干净,满负荷跑任务时活动监视器显示 CPU 占用在 40%-70%,底部外壳摸上去温热,但没到烫手程度,散热正常。
如果发现机身明显发烫,建议做两件事:一是清理摆放位置附近的风道,二是在 OpenClaw 的任务调度里,避免在同一个时间段启动大量并行任务,把高峰期摊平。常驻服务追求的是“稳定跑得久”,不是“瞬间跑得快”。
### 5.3 远程维护的日常习惯
既然要把 Mac mini 当服务器,就要习惯用 SSH 而不是图形界面去维护。我后来基本不接显示器了,所有操作都通过 SSH 完成。这个过程里有两个细节比较重要:
第一,开启并保持 SSH 服务,然后在路由器上给这台 Mac mini 做固定内网 IP。第二,定期检查 SSH 连接是否因为网络闲置被切断,可以在客户端配置里开启 TCP keepalive,或者在中途用caffeinate -d延缓系统空闲判定。对常驻服务本身来说,pmset已经让系统不会睡眠,SSH 的长连接一般也能稳定保持。
最后再分享一个体会:想让 Mac mini 成为可靠的 24 小时常驻机器,核心不是某一条命令,而是把“睡眠机制、开机自启、断电恢复、日志维护”看成一个整体。每加一个服务,都应该顺手检查这四件事有没有覆盖到。按照这套方案配置完,OpenClaw 已经连续跑了好几个月,期间我只用 SSH 进去更新过几次配置,再也没有半夜被“服务掉线”的提醒吵醒。接下来如果你也准备把 Mac mini 当作常驻服务器来用,不妨先照着这个顺序把电源策略里里外外检查一遍,再跑任何一个需要长期存活的守护进程。