1. 先搞明白OpenClaw在Mac上到底是怎么跑的
先说结论:在macOS上部署OpenClaw,本质上就是搭一条"本地智能体服务"的链路。它不是一个像微信那样双击装完就用的App,也不是一个打开浏览器输网址就能访问的网页服务,而是一个跑在终端里的自托管AI工作流工具。你负责把环境准备好,把模型入口配好,然后它会在后台监听、执行你分配的任务,甚至通过Launchd做到每次开机自动恢复运行。
我对OpenClaw的理解是:它把"多模型接入""任务编排""工具调用"这几件事打包成了一个可以本地运行的框架。你可以把它和本地模型(比如通过Ollama拉下来的qwen2.5-3b)接起来,让它完全不依赖云端完成推理;也可以接入商业API,让它在算力更充沛的情况下跑更复杂的任务。这也是为什么最近社区里讨论量突然涨起来——很多人拿它做个人自动化助理、做定时任务、做文档处理,甚至有人拿它当"macOS上班摸鱼神器"来用。
那为什么偏偏是Mac用户需要单独写一篇安装教程?因为macOS这道墙比Linux要厚。Gatekeeper会拦未签名文件,Launchd的权限体系和systemd完全不一样,Homebrew装的东西和系统自带Python之间还可能互相打架。我在Windows和Linux上都部署过同类工具,说实话,Mac上每一步都不是最难,但每一步都有小坑,叠加起来就足够让新手折腾一晚上。
这篇东西适合谁看?一是想在Mac上跑OpenClaw但没摸过Node.js和终端的人;二是已经装上了但每次开机都要手动敲命令、觉得很烦的人;三是配完之后遇到进程莫名退出、开机不启动等问题想系统排查的人。我会把安装、模型接入、Launchd自启、报错排查四件事全部串起来讲,尽量做到你拿着这篇文一步步走就能跑通。
1.1 它和ChatGPT类工具的本质区别
如果你脑海里对"AI工具"的印象还停留在"打开网页、输入问题、等回答",那需要先调整一下预期。OpenClaw这一类工具,定位是"被动常驻型执行体"。它不等着你打字问它问题,而是驻留在后台,根据配置好的规则、定时任务或者你在CLI里下的指令,自己去调用模型、调用工具、读写文件、执行命令。
打个比方:ChatGPT像是一个柜台,你过去问它问题,它给你解答;OpenClaw更像是一个请回来的办事员,你交代完规矩之后,它可以自己在你电脑里跑腿。这种差异决定了它的安装流程注定比普通聊天软件复杂:你需要给它指定工作目录、配置模型供应商、决定它有哪些系统权限,还要解决"开机后怎么自动上班"的问题。
也正是因为这个特性,Launchd自启才成了刚需。你总不可能指望自己每天早上打开电脑都先开终端敲一遍启动命令吧?我见过有人把启动命令写成alias,结果换一台电脑就忘了这回事;也有人用cron来保活,但cron在macOS上的表现并不如Linux那么省心。最终,原生的Launchd才是标准的答案。
1.2 Mac端部署这条链路里每个环节的角色
一条完整的Mac端OpenClaw链路大概是这样的:
- OpenClaw本体:负责任务编排、工具调用、与模型的对话管理。它本身不产生"智能",智能来自你接的模型。
- 模型推理入口:要么是本机Ollama拉下来的本地模型,要么是某个云端API。OpenClaw通过配置文件和这里对话。
- Node.js运行时:OpenClaw的CLI和核心服务依赖它运行,相当于引擎。
- Launchd(LaunchAgent):macOS的系统级服务管理器,负责在用户登录后拉起进程、崩溃后保活、开机后恢复。
- 工作目录与配置文件:OpenClaw跑在哪个目录、用哪个token、连哪个模型端点,全看这里的设置。
很多人安装到一半卡住,就是没搞清这个分层逻辑。比如node装好了,但OpenClaw启动后发现找不到某个依赖,于是怀疑是OpenClaw的问题,其实问题出在npm装依赖的路径不对;再比如Launchd配置好了,但进程起不来,其实是因为plist里写的执行路径和你实际安装路径不一致。这一层一层的依赖关系,就是整篇教程要帮你捋顺的主线。
1.3 这台Mac配置要什么水平才带得动
先说个让很多人安心的结论:跑OpenClaw本身,对电脑配置要求不高,因为框架层只是做任务调度和文本处理,真正吃资源的是模型推理部分。
如果只是跑OpenClaw + 云端API,那任何一台能装最新macOS的Intel Mac或者Apple Silicon Mac都能胜任,内存8GB也转得动。要是走本地模型路线,那就要看模型规模了。我实测下来,qwen2.5-3b这种3B级别的小模型,在M系列芯片的MacBook上跑得很轻松,内存占用大概2到4GB,16GB内存的机器可以一边跑OpenClaw一边正常干活不觉得卡;跑7B以上的模型,我会建议内存至少16GB,否则swap吃紧,整个系统都会变慢。
我的建议是:第一次尝试,直接用云端API或者3B级别的小本地模型把链路跑通,先把安装和自启这套流程验证好,再根据实际体验决定要不要上更大的模型。别一上来就追求70B,那不是"保姆级教程"该干的事,那是服务器该干的事。
2. 安装前的环境地基:Node.js、包管理器与权限三件事
OpenClaw在Mac上的安装,说穿了就是"把依赖跑起来、把本体拉下来、把配置写对"。但这个顺序里藏着很多新手看不到的坑。我在这一节把安装地基的三件事拆开讲清楚:用什么方式装依赖、Node.js版本怎么选、macOS的安全权限怎么处理。
2.1 用Homebrew装依赖为什么会比手动装省心
如果你是macOS用户,还没有Homebrew,那在装OpenClaw之前最好先把它装上。Homebrew是macOS圈子里事实标准的包管理器,一句话解释就是"macOS的App Store,但是命令行版"。它能帮你统一管理Node.js、Git、Ollama这些依赖软件,升级、卸载、查路径都方便得多。
安装Homebrew只需要在终端里执行官方安装命令,过程会要求你输入Mac的登录密码,正常等待即可。装完之后,我建议先执行一下brew doctor看看环境有没有异常,如果它报告有warning,多数是权限目录或Xcode Command Line Tools的问题,跟着提示处理就行。
链接:先把Homebrew装好,后面所有依赖都可以用统一的命令搞定,出错的时候排查范围也会小很多。我见过有人非要手动去官网下载.pkg安装包,结果node的路径和Shell配置对不上,OpenClaw启动时找不到node,那种坑排查起来非常痛苦。
2.2 Node.js版本踩坑:LTS与兼容性
OpenClaw这类Node.js项目,对运行时版本一般有要求,多数情况下要求是Node.js 18以上的LTS版本。所谓LTS就是Long Term Support,长期维护版,特点就是稳定、兼容性好。我不建议在这个环节尝鲜装最新的奇数版本,比如Node 22的某些中间小版本在部分框架里有兼容性问题,装完OpenClaw跑起来报一堆原生模块编译错误,你都不知道是代码的问题还是Node的问题。
推荐做法是用Homebrew装稳定LTS版本:
brew install node@20 # 或者如果不想固定版本,直接装默认node brew install node装完务必在终端里确认一下版本:
node -v npm -v如果确认完发现node命令找不到,多半是Homebrew的路径没进Shell的PATH变量。Apple Silicon芯片的Mac,Homebrew目录在/opt/homebrew/bin,你需要确认这个路径出现在你的Shell配置文件(.zshrc或.zprofile)里。这一步非常关键,很多人在后面跑npm start时报"node: command not found",就是这里埋下的雷。
2.3 终端权限和Gatekeeper对安装的影响
macOS有一个安全机制叫Gatekeeper,默认只允许运行从App Store下载或者经过Apple公证的应用。而OpenClaw这种从GitHub拉下来的命令行工具,天然就会被系统拦一道。这也是热搜词里"openclaw无法安全验证"的直接来源。
对命令行工具来说,处理方式很简单:在终端里运行一个未签名的二进制文件,系统一般不会拦你,但如果你用的是某种GUI安装包或者从浏览器下载的.dmg,那么在首次打开时就需要右键选择"打开",或者去"系统设置-隐私与安全性"里点"仍要打开"。
另外,在正式安装OpenClaw之前,我还建议先把Xcode Command Line Tools装上。很多项目的依赖在编译时会用到它,比如node-gyp编译原生模块。你可以执行:
xcode-select --install这个命令会弹出图形安装窗口。虽然OpenClaw本身不一定需要编译原生模块,但你不确定未来某个依赖要不要,提前装好可以避免"装到一半突然报错缺编译器"的尴尬。这一步在Apple Silicon机器上尤其值得做。
3. OpenClaw本体安装:从拉取代码到依赖装完
环境地基打好之后,就进到真正装OpenClaw的环节。整个流程就三个动作:获取代码、安装依赖、初始化配置。但每个动作背后都有值得注意的细节,我按顺序拆开讲。
3.1 下载方式与路径选择的讲究
获取OpenClaw本体,最主流的方式是直接从Git仓库克隆到本地。这里有一个很多人会忽略的问题:到底把项目放在哪里。
我的建议是放在用户目录下的一个固定路径,比如~/openclaw,不要放在桌面或下载文件夹里。原因有两个:第一,Launchd自启配置里需要写WorkingDirectory,路径越简单越不容易出错;第二,OpenClaw运行过程中会读写自己的配置和日志,放在系统保护目录(比如/usr/local或/Applications)会频繁触发权限问题。
克隆命令大概是这样的:
cd ~ git clone https://github.com/你的仓库地址/openclaw.git cd openclaw请留意,OpenClaw是活跃迭代的项目,仓库地址和分支名可能会随版本变化。如果你是从官方文档拿到的最新命令,就以官方为准。克隆完成之后,看一眼目录结构,里面一般会有package.json、config或.env.example这类文件,这些东西在后面都会用到。
3.2 依赖安装过程中的网络与镜像问题
进入项目目录后,安装依赖:
npm install这一步是新手最容易心态崩的地方。npm默认从官方源拉包,而官方源服务器在海外,在国内网络上经常很慢,甚至直接超时。如果你遇到network timeout或者ETIMEDOUT,不要硬等,直接切换npm镜像源。我用过的方案是:
npm config set registry https://registry.npmmirror.com设置完之后重新执行npm install,速度会明显改善。这个设置在全局生效,如果以后需要恢复官方源,把registry改回去就行。
依赖安装完成的标准是终端没有任何error级别的报错,最后能看到类似added xxx packages的提示。如果中途报错,最常见的两种:
- 版本冲突:一般是某个依赖要求更高版本的Node.js,回去用
nvm或者brew切换Node版本再试。 - 原生模块编译失败:检查Xcode Command Line Tools是否装好,装好后重新执行
npm rebuild。
3.3 初始化配置文件:token、工作目录、模型入口
依赖装完后,还需要一份配置文件来告诉OpenClaw"你的模型入口在哪、你的工作目录在哪、用什么方式认证"。
我见过不少项目提供了示例配置文件,比如.env.example或者config.example.json,你需要把它复制一份成实际文件名,比如.env或者config.json。复制完再改,别直接改示例文件,否则以后想对比原始配置都没法对比。
配置内容因版本而异,但核心字段通常包括:
- 工作目录:OpenClaw允许处理和写入文件的根路径
- 模型供应商:是本地Ollama还是云端API,以及对应的base URL
- 认证信息:API Key或其他凭证
- 日志等级:建议刚开始设成debug,方便出问题时看细节
如果你是第一次配置,不要一上来就搞花活,先做到"能跑通最小对话"就行。模型入口先写好一个(比如Ollama),其他备用入口可以等跑通后再加。
3.4 首次启动验证:跑通一个最小对话
配置写完,第一次启动建议用前台模式,这样日志直接打在终端里,任何报错都能当场看见。一般在项目目录下执行:
npm start或者项目提供的CLI命令(如openclaw start),具体以你装的项目文档为准。如果一切正常,终端会输出启动日志,告诉你服务监听的地址、加载的配置、连接到的模型。接下来你可以发一个最简单的指令测试它能不能正常响应。
这里我要特别提醒:首次启动如果报错,先看日志,别急着改配置。日志里如果出现ECONNREFUSED,说明模型端口没起来;出现MODULE_NOT_FOUND,说明npm依赖没装全;出现权限类的报错,说明配置里的工作目录没有写入权限。日志会告诉你90%的问题方向,剩下10%才是真的玄学。
4. 把模型接进来:Ollama与API两种算力方案怎么选
OpenClaw本身不产生推理能力,它必须接一个模型入口。目前常见的两种选择:本地Ollama和云端API。你会在热搜里看到"qlwen2.5-3b 关联到openclaw""ollama部署openclaw"这类词,说明本地模型路线已经是社区里的主流玩法之一。这一节我讲讲两种方案的取舍,以及各自怎么配。
4.1 为什么很多人推荐先用Ollama
Ollama是一个本地模型运行工具,解决的核心痛点是"把AI模型跑在自己电脑上,不用把对话内容发到云端"。它对Mac的适配做得很好,Apple Silicon芯片上能直接用GPU加速,而且安装非常简单。
用Homebrew一条命令就能装:
brew install ollama装完之后拉一个模型,比如:
ollama pull qwen2.5:3bqwen2.5:3b就是一个3B参数的小模型,特点是体积小、响应快、资源占用友好,非常适合在个人Mac上跑日常任务。拉取完成后,可以用ollama run qwen2.5:3b先手动验证一下模型本身能正常对话,然后再去OpenClaw里接它。先把模型单独跑通再接入框架,是一个非常好的排错习惯。
4.2 关联qwen2.5-3b这类本地模型的完整设置
把Ollama模型接入OpenClaw,核心就是让OpenClaw知道"该往哪个地址发请求"。Ollama默认在本机监听http://localhost:11434,OpenClaw的配置里模型供应商通常选Ollama,然后填上这个地址,模型名称填你pull下来的模型名(比如qwen2.5:3b)。
从启动顺序上说,你要先确保Ollama在运行,再启动OpenClaw。如果Ollama没起来,OpenClaw这边会在启动时或第一次发任务时报连接错误。这也是为什么很多人在配置里把OpenClaw和Ollama同时挂在Launchd下保活——它们是一对前后端关系,缺一个都不行。
一个小提醒:如果你用的是Apple Silicon Mac,Ollama的GPU加速能显著提升推理速度。如果跑起来明显偏慢,先确认一下系统设置里是否开启了低电量模式,那个模式会限制CPU/GPU性能,属于很容易被忽略的环境因素。
4.3 切到API时的关键配置差异
本地模型够用,但如果你要跑复杂任务,比如长文本分析、多轮工具调用或者更聪明的推理,3B级别的本地模型很快就会让你感觉到天花板。这时候就该切到云端API了。
配置API方式,通常需要你在配置文件里做三件事:
- 把模型供应商从Ollama改成对应的API类型
- 填写API Key
- 填写请求端点(endpoint)
API方式的好处是算力不在本地,模型参数规模可以大好几个数量级,响应质量有明显提升;代价是每次调用都要消耗token额度,而且会把数据发到第三方服务。如果你只是想在Mac上搭一个完全离线的个人助理,那API这条路可以直接跳过;如果你想把OpenClaw当成真正能干活的工具,那API几乎是绕不开的选项。
有些项目还支持"本地模型+API混合"的模式:简单任务走本地,复杂任务走API。这种配置在OpenClaw的配置系统里也能做,但上手门槛更高,我建议你先用一种方案跑明白,再琢磨混合模式。
4.4 两种模式实测的体验对比
我自己的实测感受是这样的:
- Ollama本地模型(qwen2.5:3b):响应速度快,隐私好,完全离线,但理解能力有限。让它做"整理文件夹里的文件""定时提醒"这类指令明确的事,表现不错;让它写长篇分析或者处理模糊指令,就开始力不从心了。
- 云端API:质量明显上了一个台阶,特别在多轮对话和工具调用场景下,很少出现"理解偏了"的情况。代价是网络依赖和费用。如果频繁跑任务,一个月下来也是真金白银的支出。
我的综合建议是:先用API跑通OpenClaw的全部功能,确认这工具确实符合你的使用习惯和需求,然后回头评估哪些任务可以降级到本地模型。不要反过来——一上来就花大量时间调本地模型,最后发现它能力不够,浪费时间不说,还容易得出"OpenClaw不好用"的错误结论。
5. Launchd开机自启:让OpenClaw在登录后就安静躺在后台
安装和模型接入跑通以后,这篇教程的重头戏才真正开始:用Launchd配置开机自启。很多人装完OpenClaw,每次开机第一件事就是打开终端敲启动命令,敲多了就觉得烦。我就是从那个阶段过来的,所以专门把Launchd这部分写得细一点,你要是不想看原理,直接复制我的plist改几个地方就能用。
5.1 launchd和Windows计划任务/自启目录的异同
macOS上实现"开机自启、崩溃重启"的标准机制是launchd。你可以把它理解成macOS版的systemd(Linux)或者Windows服务管理器(加上任务计划程序的合体)。launchd管的东西分成两类:LaunchDaemon和LaunchAgent。
两者的区别对普通用户非常重要:
- LaunchDaemon:系统级,开机时加载,不需要用户登录,一般放在
/Library/LaunchDaemons,需要管理员权限。 - LaunchAgent:用户级,用户登录后才加载,放在
~/Library/LaunchAgents,不需要管理员权限。
跑OpenClaw这种应用级程序,我强烈建议用LaunchAgent,不要用LaunchDaemon。原因有三个:第一,OpenClaw可能需要访问你的用户目录、钥匙串里的凭证,这些在用户登录之前是不一定能用的;第二,LaunchAgent不需要sudo,权限问题少一大半;第三,杀进程、重启、调试都更方便,load和unload都在用户权限下完成。
5.2 手写一份LaunchAgent plist的逐行拆解
Launchd的配置文件叫plist,本质上是XML格式的"属性列表"。你要做的就是在~/Library/LaunchAgents/目录下新建一个plist文件。
这里直接给出一份可用的模板。假设你的OpenClaw装在/Users/你的用户名/openclaw,启动命令是npm start:
<?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.local.openclaw</string> <key>ProgramArguments</key> <array> <string>/usr/local/bin/npm</string> <string>start</string> </array> <key>WorkingDirectory</key> <string>/Users/你的用户名/openclaw</string> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <dict> <key>SuccessfulExit</key> <false/> </dict> <key>StandardOutPath</key> <string>/tmp/openclaw.out.log</string> <key>StandardErrorPath</key> <string>/tmp/openclaw.err.log</string> </dict> </plist>逐行解释几个关键点:
- Label:这个任务的唯一标识,建议用反域名格式,比如
com.local.openclaw。这个名字在你用命令行查看和管理它的时候会反复用到。 - ProgramArguments:要执行的命令和参数,写成数组。这里是执行
npm start。注意,写的是npm的绝对路径,不是裸的node命令。为什么?因为launchd启动进程时不会加载你的Shell配置文件,PATH环境变量里大概率没有npm,你用绝对路径才能保证找到它。查看npm绝对路径的方法是which npm。 - WorkingDirectory:工作目录,等价于你先cd到项目目录再启动。
- RunAtLoad:设为true,表示这个plist被加载时就立刻启动进程,也就是"开机登录后自动启动"的关键开关。
- KeepAlive:进程意外退出时是否自动拉起。这里我配置的是
SuccessfulExit: false,意思是只要不是正常退出就重启。如果OpenClaw每次正常退出后也退出了,你希望继续保活,可以把KeepAlive直接写成<true/>,但那样如果你的OpenClaw支持正常退出,它会被反复拉起,所以我的建议是先用SuccessfulExit: false。 - StandardOutPath / StandardErrorPath:把标准输出和错误日志分别写到文件里。这是排查问题的生命线,没有这俩,进程挂了你是完全不知道为什么挂的。
有一点特别重要:请确认ProgramArguments里npm的路径。不同安装方式下npm路径不同,Homebrew装在Intel和Apple Silicon上的路径也不一样。我踩过的坑就是:plist里写了/opt/homebrew/bin/npm,结果在一台Intel Mac上根本没这个路径,进程一直起不来,日志里只写着找不到文件。先跑which npm看一下,再写进plist。
5.3 加载、卸载与状态查看的命令
写好了plist,接下来就是告诉launchd"有这个任务了"。
第一步,把plist放到正确的位置。如果你用编辑器直接存成了~/Library/LaunchAgents/com.local.openclaw.plist,那就已经到位了。如果有前缀的临时文件,先改名处理好。
第二步,加载任务。macOS新老版本命令不同,我建议用新命令:
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.local.openclaw.plist这条命令把plist注册进当前用户的GUI会话域。早期版本的写法是:
launchctl load ~/Library/LaunchAgents/com.local.openclaw.plist其实load命令目前仍然可用,只是被标记为deprecated,我个人的建议是优先用bootstrap,遇到兼容问题再退回到load。
加载之后,立刻验证进程有没有起来:
launchctl list | grep openclaw如果输出里能看到openclaw那一行,并且第一列的PID不是减号,说明进程已经在跑了。注意,launchctl list 输出的第一列是PID,第二列是最后退出状态码,第三列是Label。如果PID是-,说明launchd知道这个任务,但进程没有启动成功,大概率是你的plist有问题或者执行命令路径不对。
等你想停止的时候:
launchctl bootout gui/$(id -u)/com.local.openclaw执行之后,进程会被终止,Launchd也不会再管它。修改plist之后,必须bootout再bootstrap一次,这样改动才会生效。
5.4 开机自启失效的三个高发原因
Launchd配置好之后,重启电脑验证一下是不是真的自启成功。如果失败了,最常见的三个原因,挨个排查:
第一个,plist里ProgramArguments的路径问题。我在前面强调过,launchd不会加载你的Shell环境,所以写在里面的一律用绝对路径。如果你不确定,可以先执行which npm和pwd,拿到确切的绝对路径填进去。
第二个,权限和格式问题。plist文件名必须和Label一致,且必须以.plist结尾;plist文件本身不能有XML语法错误。找个plist校验工具或者直接在终端里跑plutil -lint ~/Library/LaunchAgents/com.local.openclaw.plist,它会告诉你格式有没有问题。
第三个,KeepAlive和启动速度的冲突。如果你的OpenClaw启动非常慢,但KeepAlive配置成"退出就重启",launchd可能在你还没起来的时候又重启一次,反复几分钟之后直接放弃。这种情况的解决思路是:先用前台模式确认OpenClaw正常启动需要多久,再决定KeepAlive的写法。其实大多数情况下OpenClaw启动都是秒级的,这个坑概率不高,但一旦遇到会非常困惑。
6. 保姆级排错:安装与自启最常见的五个坑及完整排查链路
这几天我在热搜里看到太多人遇到同样的问题:"openclaw无法安全验证""终端提示没有node""Mac上配置了Launchd但进程死活起不来"。我把这些高频问题整理成一套排查链路,遇到问题时按顺序走,比瞎试快得多。
6.1 "无法安全验证"的处理
这个问题出现的前提是:你下载了某种图形化安装包,或者通过双击方式运行了OpenClaw相关的可执行文件。macOS的Gatekeeper会拦截没有Apple签名或公证的软件,弹窗提示"无法验证开发者"。
命令行场景下的正确处理思路:
- 如果是命令行工具直接从Git克隆、通过npm安装的,压根不会触发这个弹窗,正常跑就行。
- 如果确实下载了.dmg或.pkg,可以在系统设置——隐私与安全性里找到被拦截的提示,点击"仍然打开"。
- 也可以用命令直接放行:
xattr -dr com.apple.quarantine /path/to/程序,但这种方式有安全风险,我只建议在确认软件来源可靠的前提下使用。
6.2 终端提示node找不到或版本不对
这个问题几乎都是PATH配置导致的。你在终端里敲node -v能显示,但OpenClaw启动时报找不到node,或者Launchd里写的是/usr/local/bin/npm但实际装在了/opt/homebrew/bin。
排查步骤:
- 先执行
which node和which npm,记下绝对路径 - 检查plist里的ProgramArguments是否用了这个路径
- 如果是手动装的Node,检查Shell配置文件(
.zshrc、.zprofile、.bash_profile)里有没有正确导出PATH
一个非常实用的验证方法:在终端里用launchd的环境手动运行一遍命令。比如plist里的命令是npm start就需要先cd /Users/你的用户名/openclaw再执行它,看能不能跑起来。如果手动都起不来,那问题就不在launchd,而在OpenClaw本身的配置。
6.3 Launchd日志为空、进程起不来自查顺序
这是最让人头疼的情况:plist写了、bootstrap执行了、launchctl list里也能看到任务,但进程就是没起来,日志文件里什么都没有。
这时候按顺序查:
- 看plist是否合法:
plutil -lint - 看任务状态:
launchctl print gui/$(id -u)/com.local.openclaw,这个命令会输出极其详细的状态信息,包括最后退出状态码、失败原因、执行路径。如果提示no such service,说明bootstrap没有成功。 - 看系统日志:
log show --last 1h --predicate 'process == "launchd"' --style syslog,不过这个命令输出量很大,我一般先看launchctl print的输出,确认路径没问题再看这里。 - 如果launchctl print里显示状态码非0,那就说明进程确实启动过但是崩了。这时候StandardErrorPath里应该有东西,打开看。
一个容易被忽略的细节:如果你修改了plist但没有bootout旧任务,直接重新bootstrap会报"service already loaded",注意先bootout再bootstrap。
6.4 开机后系统负载飙高的处理
有读者反馈,配好OpenClaw自启后,开机没多久风扇狂转、系统负载很高。这种情况通常是两件事叠加导致的:本地模型推理太吃资源 + KeepAlive配置了"碎尸万段也要重启"。
排查思路是:
- 先用
top或者活动监视器看是哪个进程在吃CPU。如果是Ollama,说明是模型在加载或推理,M系列芯片通常很快会降下来;如果是node,说明OpenClaw在跑某种初始化任务。 - 如果是3B小模型,资源占用一般不会持续很久;如果是7B以上的模型,建议把启动后的任务量减少,别让模型一开机就做大批量任务。
- 检查KeepAlive配置。如果OpenClaw因为某个原因崩溃,但Ollama正常,launchd会把OpenClaw立刻重启,反复崩溃反复重启,当然负载高。这种场景下,先看崩溃日志解决崩溃原因,比调整KeepAlive更重要。
6.5 数小时后进程静默退出的分析
还有一种情况比"起不来"更隐蔽:开机时一切正常,过了几个小时发现OpenClaw悄悄退了,launchd却没有把它拉起来。
遇到这种问题,第一个动作就是看日志。/tmp/openclaw.err.log里往往会有退出前的最后几行线索,比如某个任务执行异常、内存不足、或者是网络断连导致的重试失败。
第二个思路是看KeepAlive的语义。如果你配的是SuccessfulExit: false,那意味着"如果程序自己正常退出,就不再拉起"。有些框架在空闲一段时间后为了释放资源会正常退出,这正好就避开了KeepAlive的保护。如果你希望它一直常驻,就把KeepAlive改成<true/>,这样即使正常退出也会被拉起。但也要留意,如果OpenClaw本身有"退出码0代表主动关闭"的设计,通常你会希望尊重它,这时候到底要不要强拉,取决于你的使用场景。
另外,macOS的App Nap机制也可能坑你。Mac会对不活跃的后台进程进行节能冻结,如果你的OpenClaw进程被系统判定为"可休眠",它可能停止响应但不退出。解决这个问题的思路是给进程加上不进入App Nap的属性,具体在plist里可以通过ProcessType等键去调整,但不同macOS版本的策略不太一样,更通用的做法是确保OpenClaw本身有周期性任务在跑,让它持续"活跃"。
最后插一句我个人的实操体会:Launchd自启配置这件事,第一次成功之后你会觉得很简单,但第一次排查会让你怀疑人生。所以我的建议是,配置完别急着关机重启,先手动launchctl kickstart gui/$(id -u)/com.local.openclaw触发几次,确认进程能反复拉起、日志能正常写入、系统负载稳定,再考虑让它承担开机自启的重任。
我自己经历过完整过程之后,最深的感觉是:macOS上部署这类工具最怕的不是步骤复杂,而是"每一步都看似成功,但链路没通"。所以这篇教程的方式是先讲透分层关系,再按顺序装,最后用Launchd把这套链路固化下来——只要你对"OpenClaw负责干活、模型负责推理、launchd负责保活"这条主线心里有数,后面无论遇到什么报错,都能快速定位到该查哪一层,而不是像无头苍蝇一样到处找答案。