【问题标题】:launchctl can't run the binary and exits with a code 78launchctl 无法运行二进制文件并以代码 78 退出
【发布时间】:2019-06-27 10:32:54
【问题描述】:

我一直在构建一个带有系统托盘 GUI 的 golang app。我希望launchctl 在我登录时运行我的程序。程序编译并运行没有任何错误,但是,当launchctl 运行它时,我看到:Service exited with abnormal code: 78。也许这与权利有关。

  • 首先我尝试将当前用户的权限设置为plist 文件和二进制文件。还是报错78

  • 然后我将plist文件和二进制文件的权限更改为root并运行sudo launchctl。我仍然看到错误 78

/var/log/system.log 有这个错误:

14:46:00 Macchiato com.apple.xpc.launchd[1] (com.test.test[519]): Service could not initialize: 18A391: xpcproxy + 11291 [1534][8188841E-6D08-3F80-8488-9B5D7462BACB]: 0xd
14:46:00 Macchiato com.apple.xpc.launchd[1] (com.test.test[519]): Service exited with abnormal code: 78
14:46:00 Macchiato com.apple.xpc.launchd[1] (com.test.test): Service only ran for 0 seconds. Pushing respawn out by 10 seconds.

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>com.test.test</string>
        <key>ProgramArguments</key>
        <array>
                <string>/Users/test-user/test/test</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>ProcessType</key>
        <string>Standard</string>
        <key>KeepAlive</key>
        <true/>
        <key>StandardErrorPath</key>
        <string>/var/log/test-err.log</string>
        <key>StandardOutPath</key>
        <string>/var/log/test-out.log</string>
</dict>
</plist>

错误日志为空。

当我手动运行binary 时,应用程序的图标出现在系统托盘上,正如预期的那样。

有一个有趣的时刻——如果我手动输入launchctl load -w com.test.test.plist,应用程序运行良好——直到重新启动。重启后,launchctl 抛出 78 错误。

为什么会这样?

【问题讨论】:

    标签: macos plist root daemon launchctl


    【解决方案1】:

    我想我解决了自己的问题。我使用时似乎出现了错误78

    <key>StandardErrorPath</key>
    <string>/var/log/test-err.log</string>
    <key>StandardOutPath</key>
    <string>/var/log/test-out.log</string>
    

    当我删除这行时,错误消失了。这特别奇怪,因为plist 文件具有root 权限,而launchd 也以root 身份运行...

    【讨论】:

    • 我认为您对启动代理(在用户会话中以普通用户身份运行)和启动守护进程(主要以 root 身份运行,与登录者无关)之间的区别感到困惑。如果您希望它在用户会话中运行,它必须是一个代理,在这种情况下它没有权限写入 /var/log。
    • 当你删除上面的路径时,日志和错误输出是在别处结束还是在别处结束?
    • 这对我没有影响。值得注意的是,我还在使用 go 程序和内置函数(睡眠)工作。
    猜你喜欢
    • 2019-01-10
    • 2014-06-14
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2011-04-14
    • 1970-01-01
    相关资源
    最近更新 更多