2020 年 6 月更新

2020 年 6 月更新

为什么我的配置 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 月更新

我创建了一个跨平台工具来处理创建launchdsystemd服务文件:

使用 launchd

launchd很容易陷入“奇怪”的状态。

  • load配置文件,以及潜在的日程一次发射。
  • unloadstop 取消配置文件的调度
  • 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 重新加载它)

文件中使其开启的键startloadRunAtLoad如果KeepAlive它因某种原因死亡,则保持其运行)

<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>

有时从 launchctl 本身获取调试日志记录会比较棘手,但键StandardErrorPathStandardOutPath至少可以帮助您了解应用程序是否因缺失或错误信息(例如未扩展的环境变量或不可写的路径)而终止。只需确保您指定的路径可由运行该进程的用户写入即可。

<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 文件时都必须这样做。

相关内容