【问题标题】:How can I debug a Launchd script that doesn't run on startup?如何调试启动时不运行的 Launchd 脚本?
【发布时间】:2011-09-14 07:35:24
【问题描述】:

我有一些来自 homebrew 的 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>

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

【问题讨论】:

  • 我认为这不会产生任何影响(因此,我没有将其作为答案),但请尝试在没有“-w”标志的情况下运行它进行测试(即“launchctl load ~/Library/LaunchAgents/com.mysql.mysqld.plist") 然后重启。或者,也许尝试 plist 的完整文件路径(例如 /Users/{you}/Library/LaunchAgents/com.mysql.mysqld.plist)。只是在这里猜测。
  • 不是一个真正的答案,但我相信LaunchControl 会告诉你原因。
  • 查看我的answer 来解决类似问题。

标签: macos launchd


【解决方案1】:

一种可能:查看目录:

/private/var/db/launchd.db/

并为您的用户完善“com.apple.launchd.peruser.###”文件。打开它,看看是否有这样的条目:

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

如果是这样,请尝试将其设置为 &lt;false/&gt;。另一个要查找相同内容的文件是:

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

【讨论】:

  • 看起来很有希望,可惜是&lt;false/&gt;
  • 也许试着把它全部剪掉?我不知道这会有什么不同,但我正在抓住稻草。
【解决方案2】:

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

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

和 plist 中的 Label 部分:

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

如果您保存备份副本,请确保将其移出 ~/Library/LaunchAgents/ 目录。

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

【讨论】:

    【解决方案3】:

    我在您的 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 将每个命令项作为数组中的&lt;string&gt; 项。

    编辑: 就我而言,为 shell 脚本生成一个简单的包装器效果更好。 此脚本设置基本文件夹结构,以将 shell 脚本制作成 OS X“应用程序”-https://gist.github.com/mathiasbynens/674099。这可能更适合您的 mysql -u arg1 命令。

    【讨论】:

      【解决方案4】:

      启动命令期望作业 Label 作为它的参数,因此您可以使用以下命令启动它...

      launchctl start com.myfile.hostname.plist
      

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

      launchctl stop com.myfile.hostname.plist
      

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

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

      【讨论】:

        【解决方案5】:

        对我来说,到目前为止,其他解决方案对我没有帮助。我的问题有点难以调试,因为 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。因为我有时懒得加这行。

        添加标题后,一切正常。

        【讨论】:

          【解决方案6】:

          从 OSX Yosemite 10.10 起,launchctl 命令已更改。

          需要以下命令才能在reboot 处自动启动服务。

          sudo launchctl bootstrap system /Library/LaunchDaemons/${YOUR_SERVICE_NAME}.plist
          sudo launchctl enable system/${YOUR_SERVICE_NAME}
          sudo launchctl kickstart -kp system/${YOUR_SERVICE_NAME}
          

          注意:它将以root用户启动服务并在系统范围内启动。

          参考资料: Launchctl 手册页(https://ss64.com/osx/launchctl.html)

          【讨论】:

            猜你喜欢
            • 2013-05-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-03-29
            • 1970-01-01
            相关资源
            最近更新 更多