![2020 年 6 月更新](https://linux22.com/image/1454684/2020%20%E5%B9%B4%206%20%E6%9C%88%E6%9B%B4%E6%96%B0.png)
为什么我的配置 plist 文件不能使用 launchctl 作为服务加载?
我正在运行 OSX Yosemite,并且已经阅读了这篇关于使用 launchctl 的优秀教程http://nathangrigg.net/2012/07/schedule-jobs-using-launchd/
我已经创建了一个正确的 .plist 文件,其中包含服务的配置(我知道这是正确的,因为它几乎是我几年前创建的一个工作 plist 配置文件的精确副本)。我输入
launchctl load ~/Library/LaunchAgents/com.apple.myservice.plist
并得到回应
~/Library/LaunchAgents/com.apple.myservice.plist: File exists
这不是很具描述性,但我还是输入了
launchctl start com.apple.myservice
没有任何输出,也没有任何事情发生。我也尝试过使用
launchctl enable ~/Library/LaunchAgents/com.apple.myservice.plist
我只是得到一个
Usage: launchctl enable <service-target>
作为回应。
有人可以回复在 OSX Yosemite 上加载 launchd 服务的正确语法吗?
答案1
2020 年 6 月更新
我创建了一个跨平台工具来处理创建launchd
和systemd
服务文件:
使用 launchd
launchd
很容易陷入“奇怪”的状态。
load
指读配置文件,以及潜在的日程一次发射。unload
指stop
和取消配置文件的调度start
将启动服务(我认为忽略时间表)stop
将停止服务(再次忽略时间表)
一般来说,如果您想“重新启动”它,您可以像这样卸载并重新加载配置:
launchctl unload -w ~/Library/LaunchAgents/com.apple.myservice.plist
launchctl load -w ~/Library/LaunchAgents/com.apple.myservice.plist
意思-w
是“写入”,这意味着更改将影响重启(每次登录或启动时都会加载……或者在登录或启动时不会再加载)。
如果它是系统级服务(在/Library/LaunchDaemons
或/Library/LaunchAgents
您可能需要使用它sudo
(如果您错误地没有使用 sudo 执行了此操作,则可能需要在没有 sudo 的情况下卸载它,然后使用 sudo 重新加载它)
文件中使其开启的键start
是load
(RunAtLoad
如果KeepAlive
它因某种原因死亡,则保持其运行)
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
有时从 launchctl 本身获取调试日志记录会比较棘手,但键StandardErrorPath
和StandardOutPath
至少可以帮助您了解应用程序是否因缺失或错误信息(例如未扩展的环境变量或不可写的路径)而终止。只需确保您指定的路径可由运行该进程的用户写入即可。
<key>StandardErrorPath</key>
<string>/tmp/appname-error.log</string>
<key>StandardOutPath</key>
<string>/tmp/appname-info.log</string>
因为它们很难调试,所以我建议使用启动控制或者推出并将其与健康阅读相结合launchd.info。
此外,这里还有许多调试提示: https://serverfault.com/questions/183589/how-do-i-activate-launchd-logging-on-os-x
我自己还没有尝试过,但是这个解决方案看起来最简单:
sudo launchctl log level debug
tail -f /var/log/system.log
答案2
我今天遇到了类似的问题。
只需卸载该服务并再次加载即可解决File exists
问题。
看起来每次更新 plist 文件时都必须这样做。