如何使用 Mac OSX 的 launchctl 启动服务

alm*_*mel 7 launchd launchctl macos

为什么我的配置 plist 文件没有使用 launchctl 作为服务加载?

我正在运行 OSX Yosemite,我已经阅读了这个关于使用 launchctl http://nathangrigg.net/2012/07/schedule-jobs-using-launchd/ 的优秀教程

我已经使用服务的配置创建了一个正确的 .plist 文件(我知道这是正确的,因为它几乎是我几年前创建的工作 plist 配置文件的副本)。我输入

launchctl load ~/Library/LaunchAgents/com.apple.myservice.plist
Run Code Online (Sandbox Code Playgroud)

并得到回应

~/Library/LaunchAgents/com.apple.myservice.plist: File exists
Run Code Online (Sandbox Code Playgroud)

这不是非常具有描述性,但我去打字

launchctl start com.apple.myservice
Run Code Online (Sandbox Code Playgroud)

并且没有输出,什么也没有发生。我也尝试使用

launchctl enable ~/Library/LaunchAgents/com.apple.myservice.plist
Run Code Online (Sandbox Code Playgroud)

我只是得到一个

Usage: launchctl enable <service-target>
Run Code Online (Sandbox Code Playgroud)

作为回应。

有人可以回复在 OSX Yosemite 上加载启动服务的正确语法吗?

coo*_*j86 13

2020 年 6 月更新

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

使用启动

launchd 很容易进入“怪异”状态。

  • load意味着读取配置文件并可能安排启动。
  • unload意味着stop 取消调度配置文件
  • start 将启动服务(忽略时间表,我相信)
  • stop 将停止服务(再次,忽略时间表)

通常,如果您想“重新启动”它,您可以像这样卸载并重新加载配置:

launchctl unload -w ~/Library/LaunchAgents/com.apple.myservice.plist
launchctl load -w ~/Library/LaunchAgents/com.apple.myservice.plist
Run Code Online (Sandbox Code Playgroud)

-w意思是“写”,这意味着该变化将影响重新启动(将加载每次登录或启动...或不会在登录或启动以后再加载)。

如果它是系统级服务(在/Library/LaunchDaemons或者/Library/LaunchAgents你可能需要这样做sudo(如果你在没有 sudo 的情况下错误地做了,你可能需要在没有 sudo 的情况下卸载它,然后用 sudo 重新加载它)

导致它start打开的文件中的关键loadRunAtLoadKeepAlive如果它因某种原因死亡,则保持运行)

<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
Run Code Online (Sandbox Code Playgroud)

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

<key>StandardErrorPath</key>
<string>/tmp/appname-error.log</string>
<key>StandardOutPath</key>
<string>/tmp/appname-info.log</string>
Run Code Online (Sandbox Code Playgroud)

因为它们很难调试,我建议使用LaunchControl启动并将其与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
Run Code Online (Sandbox Code Playgroud)


dai*_*isy 4

我今天遇到了类似的问题。

只需卸载该服务并重新加载即可解决File exists问题。

看起来每次更新 plist 文件时都必须这样做。