launchd状态78是什么意思??为什么我的用户代理没有运行?



我想在登录时在后台运行一个一致同步服务。但是我的代理的状态代码是78。我不知道为什么,我试过在网上发布一些修复程序,但就是不起作用。

怎么了??下面是我的服务的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>Label</key>
    <string>syncmyproject</string>
    <key>StandardOutPath</key>
    <string>/var/log/syncmyproject.log</string>
    <key>StandardErrorPath</key>
    <string>/var/log/syncmyproject.log</string>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>Debug</key>
    <true/>
    <key>EnableGlobbing</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/local/bin/unison</string>
      <string>-auto</string>
      <string>-batch</string>
      <string>-repeat watch</string>
      <string>~/home/project</string>
      <string>~/project</string>
    </array>
</dict>
</plist>

我读了man launchctl,发现78表示function not implemented。这没有多大帮助。

最后我让它工作起来,实际上plist中有错误,我建议安装brew install --cask launchcontrol,这是一个用于启动ctl的gui工具,它可以帮助检测错误和解决问题。

我发现这个错误与权限有关。我试图将错误和日志重定向到用户无法写入的/var/log目录。将路径更改为我的用户有适当权限进行r+w修复的路径。

此外,在加载LaunchAgent时要小心。如果您在~/Library/LaunchAgents目录中,请不要使用sudo加载plist。

要查看所有错误代码的描述,请键入

launchctl error <insert numerical error code here>

例如:

%launchctl错误7777:没有可用的锁

[也遇到了这个问题,所以记录了我的发现]

"78"是您正在运行的作业的最后一个退出代码。来自man launchctl:

在没有参数的情况下,将加载到launchd中的所有作业分为三个列出列。如果作业正在运行,则第一列显示作业的PID-宁第二列显示作业的最后退出状态。如果此列中的数字为负数,表示停止作业的信号。因此,"-15"表示作业已使用SIGTERM终止。第三列是作业的标签。如果指定了[label],则打印有关请求作业的信息。

也就是说,无论你开始做什么工作,你都需要阅读文档(或源代码)。(在我的例子中,mysqld)

值得注意的是,"78"是Linux上的标准退出代码,表示存在配置错误。所以,看看你的作业配置(和错误日志?),看看你是否有配置错误的地方。

以下是我的感受:在Mac OS X中,即使文件中"只有脚本",也可以从命令行运行shell脚本。但是,当您从launchd运行它们时,您必须告诉应该运行脚本的二进制文件。假设从命令行运行时,它只使用当前所在的shell(在我的例子中是bash),但从launchd运行时没有"环绕脚本"。我添加了

#!/bin/sh

作为脚本文件中的第一行,然后它就工作了。

在我的情况下,<ProgramArguments>中的脚本是不可执行的,因此会得到78 function not implemented.

与上面类似,我得到了状态78,因为我的脚本路径中有符号链接。修复方法是使用绝对路径。

我在尝试运行mono以启动本地Web服务器时遇到此错误。事实证明,修复方法不是使用"which mono"(这是一个符号链接:/Library/Frameworks/Mono.framework/Versions/Current/Commands/mono)给出的mono路径,而是使用exe的实际位置(在我的情况下是/Library/Frameworks/Mono.framework/Commands/mono)。

为了xml格式问题,我一直在获取78代码:

起初,我的emacs自动重新格式化我的xml,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>user.eric.g.autosyncdropbox.agent</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/eric/G/bin/fswatchG.sh</string>
    </array>
    <key>KeepAlive</key>
    <true />
    <key>StandardOutPath</key>
    <string>
    /Users/eric/.tmp/user.eric.g.autosyncdropbox.out.log</string>
    <key>StandardErrorPath</key>
    <string>
    /Users/eric/.tmp/user.eric.g.autosyncdropbox.error.log</string>
  </dict>
</plist>

而我却找不到这两行是退货的。。。

    <string>
    /Users/eric/.tmp/user.eric.g.autosyncdropbox.out.log</string>
    <key>StandardErrorPath</key>
    <string>
    /Users/eric/.tmp/user.eric.g.autosyncdropbox.error.log</string>

那太糟糕了,简直是在浪费生命。。。

我一直在寻找状态78错误。

我的LaunchDamon可以手动启动,状态为0,但在系统重新启动后具有状态78。有时守护进程正在运行,有时却没有。

在这种情况下,使用LaunchControl应用程序(顺便说一句,这很好)没有帮助。标准输出和错误文件中没有输出。

我可以通过向守护进程添加KeepAlive条件来解决这个问题plist文件,引用后台程序可执行文件所在的已安装文件系统。

<key>KeepAlive</key>
<dict>
    <key>PathState</key>
    <dict>
    <key>/Volumes/MountedFileSystem</key>
    <true/>
    </dict>
</dict>

我希望这条建议能帮助到别人。

相关内容

最新更新