如何调试未在启动时运行的Launchd脚本?

时间:2011-06-13 23:19:49

标签: macos launchd

我有一些自制的启动脚本。但是,当我重新启动计算机时,我必须手动运行它们:

launchctl load -w ~/Library/LaunchAgents/com.mysql.mysqld.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>KeepAlive</key>
  <true/>
  <key>Label</key>
  <string>com.mysql.mysqld</string>
  <key>Program</key>
  <string>/Users/dash/.local/Cellar/mysql/5.1.49/bin/mysqld_safe</string>
  <key>RunAtLoad</key>
  <true/>
  <key>UserName</key>
  <string>dash</string>
  <key>WorkingDirectory</key>
  <string>/Users/dash/.local/var</string>
</dict>
</plist>

我认为这应该在启动时发生。我错过了什么?

5 个答案:

答案 0 :(得分:22)

我发现在你的plist中调试的最佳方式:

<key>StandardErrorPath</key>
<string>/tmp/mycommand.err</string>
<key>StandardOutPath</key>
<string>/tmp/mycommand.out</string>

打开控制台应用程序,在“所有消息”中,您应该在应用程序失败或成功时看到条目。像这样:

4/28/15 10:43:19.938 AM com.apple.xpc.launchd[1]: (mycommand[18704]) Service exited with abnormal code: 1

我遇到的问题是ProgramArguments将每个命令项作为数组中的<string>项。

编辑: 在我的例子中,为shell脚本生成一个简单的包装器工作得更好。 此脚本设置基本文件夹结构,以将shell脚本转换为OS X“app” - https://gist.github.com/mathiasbynens/674099。这可能更适合您的mysql -u arg1命令。

答案 1 :(得分:2)

一种可能性:查看目录:

/private/var/db/launchd.db/

并为您的用户填写“com.apple.launchd.peruser。###”文件。打开它,看看是否有类似的条目:

<key>com.mysql.mysqld.plist</key>
<dict>
    <key>Disabled</key>
    <true/>
</dict>

如果有,请尝试将其设为<false/>。另一个寻找相同内容的文件是:

/private/var/db/launchd.db/com.apple.launchd/overrides.plist

答案 2 :(得分:1)

start命令需要作业 Label 作为参数,因此您可以使用以下内容启动它...

launchctl start com.myfile.hostname.plist

要停止,只需执行以下操作即可...

launchctl stop com.myfile.hostname.plist

完成所有测试后,您将注销然后加载它,或者如果您的plist文件位于用户库文件夹中,请输入以下内容...

launchctl load ~/Library/LaunchAgents/com.myfile.hostname.plist

答案 3 :(得分:0)

尝试重命名。将文件名更改为:

~/Library/LaunchAgents/com.mysql.mysqld2.plist

和plist中的Label部分:

<key>Label</key>
<string>com.mysql.mysqld2</string>

如果保存备份副本,请确保将其移到〜/ Library / LaunchAgents /目录之外。

最后,不要使用launchctl来加载它,只需注销并重新登录。这将让launchd自己从“LaunchAgents”目录中取出它,并从混合中取出另一个变量(即launchctl)。

答案 4 :(得分:0)

对我来说,其他解决方案到目前为止对我没有帮助。我的问题有点难以调试,因为plist文件正确,脚本在终端中单独运行良好。一切看起来都很好,但是不起作用。

我通过执行检查日志文件

tail -f /var/log/system.log

然后使用以下命令再次卸载并加载服务:

launchctl unload ~/Library/LaunchAgents/example.plist
launchctl load ~/Library/LaunchAgents/example.plist

我从日志文件中发现了一条错误消息:

Program specified by service is not a Mach-O executable file.

这到底是什么意思?我没有谷歌。但是,我觉得这是因为我没有在Shell脚本的开头添加#!/bin/bash。因为有时候我懒于添加这行。

添加标题后,一切正常。