macOS重启后无法自动执行Shell脚本的问题解决方法
macOS launchd启动脚本失效故障解决方案
现有配置的核心错误
你当前的配置存在多个直接导致加载失败的问题:
- plist存在XML语法错误:多处
</string>闭合标签误写为</strings(多了尾部s、缺失闭合尖括号);DOCTYPE声明使用了中文弯引号,DTD地址中的数字1误写为小写l,XML解析直接失败 - 配置逻辑冲突:同时设置
LaunchOnlyOnce和KeepAlive两个语义互斥的参数,launchd加载时会出现行为异常 - 存放路径错误:
/Library/LaunchDaemons下的服务为系统级守护进程,运行于用户登录前的无GUI会话上下文,无权限执行open命令调起图形化应用,必然触发10810错误 - 脚本路径不严谨:脚本内使用相对路径调用app,launchd运行时的工作目录和环境变量和你手动打开终端时不一致,会找不到目标文件
- 登录项配置方式错误:将plist/sh文件直接加入登录项时,系统默认按普通文件打开,不会按launchd规则解析执行,因此只会打开脚本文件不会运行内部命令
分步修复方案
1. 修正Shell脚本
- 打开
/usr/local/bin/rwm.sh,将其中的open filename.app替换为目标应用的绝对路径,例如应用存放在应用程序目录时写为open /Applications/你的目标程序.app,禁止使用相对路径 - 终端执行命令给脚本添加可执行权限:
chmod +x /usr/local/bin/rwm.sh
- 手动执行脚本验证可用性:
/usr/local/bin/rwm.sh,确认目标app可以正常启动后再进行下一步
2. 编写正确的plist文件
删除原有错误的plist文件,在~/Library/LaunchAgents/路径下新建com.start.activity.plist(单用户生效放该路径即可,需要所有用户登录生效则放/Library/LaunchAgents/,绝对不要放LaunchDaemons目录),写入以下内容:
<?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.start.activity</string> <key>ProgramArguments</key> <array> <string>/bin/sh</string> <string>/usr/local/bin/rwm.sh</string> </array> <key>RunAtLoad</key> <true/> <key>StandardOutPath</key> <string>/tmp/rwm_launch.log</string> <key>StandardErrorPath</key> <string>/tmp/rwm_launch_err.log</string> </dict> </plist>
配置说明:移除了冲突的LaunchOnlyOnce、KeepAlive参数;所有可执行文件使用绝对路径,避免环境变量导致的找不到命令问题;新增日志输出路径,方便后续排查问题
3. 加载并验证服务
终端依次执行以下命令:
- 卸载之前错误加载的同名服务,避免冲突:
launchctl unload ~/Library/LaunchAgents/com.start.activity.plist
- 修正plist文件权限:
chmod 644 ~/Library/LaunchAgents/com.start.activity.plist
- 重新加载服务:
launchctl load ~/Library/LaunchAgents/com.start.activity.plist
- 无需重启,立即测试服务运行状态:
launchctl start com.start.activity
执行后如果目标app正常启动,说明配置生效,重启后会自动运行。如果未启动,直接查看/tmp/rwm_launch_err.log中的错误日志定位问题即可。
常见问题补充
lsopenurlswithrole() failed 10810错误触发原因:要么是目标app路径填写错误,要么是执行open命令的上下文无GUI访问权限(比如在LaunchDaemon、SSH远程会话中执行该命令就会稳定复现该错误)- 不要将.plist或.sh脚本直接加入登录项:该方式不会触发launchd的服务加载逻辑,系统只会调用默认的文本编辑器/脚本编辑器打开对应文件,不会执行内部逻辑
内容的提问来源于stack exchange,提问作者Trimantra Software Solution
相关产品推荐
相关产品推荐

