macOS安装后如何按需启动Launch Agent?启动失败问题排查
我为macOS编写了Launch Daemon和Launch Agent。应用安装后需要同时运行两者:
- 将Daemon的.plist文件放入
/Library/LaunchDaemons目录,以管理员身份执行:
由于该plist配置了:launchctl load /Library/LaunchDaemons/com.example.MyDaemon.plist
Daemon可立即启动。<key>RunAtLoad</key> <true/> <key>KeepAlive</key> <true/>
但配置Launch Agent时遇到问题:将其plist文件放入/Library/LaunchAgents目录(用于所有用户及登录界面启动),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>LimitLoadToSessionType</key> <array> <string>Aqua</string> <string>LoginWindow</string> </array> <key>Disabled</key> <false/> <key>Label</key> <string>com.example.MyAgent.plist</string> <key>Program</key> <string>/Library/PrivilegedHelperTools/com.example/MyAgent</string> <key>ProgramArguments</key> <array> <string>-d</string> </array> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <true/> </dict> </plist>
尝试执行以下命令时出现错误:
launchctl load /Library/LaunchAgents/com.example.MyAgent.plist
错误信息:
Warning: Expecting a LaunchDaemons path since the command was ran as
root. Got LaunchAgents instead.launchctl bootstrapis a recommended
alternative. /Library/LaunchAgents/com.example.MyAgent.plist:
Path had bad ownership/permissions Load failed: 122: Path had bad
ownership/permissions
请问我哪里操作有误?
1. 权限与所有权不匹配(错误码122核心原因)
/Library/LaunchAgents下的plist文件必须满足严格的系统权限要求:
- 所有者必须是
root - 所属组必须是
wheel - 文件权限必须设置为
644(所有者可读可写,组和其他用户只读)
执行以下命令修正:
sudo chown root:wheel /Library/LaunchAgents/com.example.MyAgent.plist sudo chmod 644 /Library/LaunchAgents/com.example.MyAgent.plist
同时要检查Agent指向的程序文件/Library/PrivilegedHelperTools/com.example/MyAgent权限:
- 所有者设为
root,组设为wheel - 权限设置为
755(所有者可执行,组和其他用户可读可执行)
2. 错误的加载命令身份与方式
Launch Agent是用户会话级服务,即使是全局的/Library/LaunchAgents,也不能直接用root执行旧版的launchctl load。系统提示的launchctl bootstrap是正确替代方案,针对全局Agent执行:
sudo launchctl bootstrap system /Library/LaunchAgents/com.example.MyAgent.plist
需要立即启动的话,加上-w参数:
sudo launchctl bootstrap -w system /Library/LaunchAgents/com.example.MyAgent.plist
3. plist配置的小错误
你的Label字段多了.plist后缀,正确的Label应该是com.example.MyAgent(不需要扩展名),修正后:
<key>Label</key> <string>com.example.MyAgent</string>
Label是服务的唯一标识,错误后缀可能导致后续管理命令失效。
4. 验证加载状态
执行完上述操作后,用以下命令检查Agent是否正常加载:
launchctl list | grep com.example.MyAgent
返回包含PID的行即为加载成功。
内容的提问来源于stack exchange,提问作者c00000fd

