我想在登录时在后台运行一个一致同步服务。但是我的代理的状态代码是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>
我希望这条建议能帮助到别人。