Mac Leopard 使用 Lingon 创建的 Launchd Daemon 无法运行

Mac Leopard 使用 Lingon 创建的 Launchd Daemon 无法运行

首先:我对 Mac 非常陌生,所以这个问题可能非常非常基本。

我一直在尝试设置一个 Launchd Daemon 在启动时运行,以通过 Mono.Frameworks 运行服务。我使用 Lingon 创建了 .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.netviewer.WorkerContainer</string>
<key>ProgramArguments</key>
<array>
    <string>sudo</string>
    <string>/Library/Frameworks/Mono.framework/Versions/Current/bin/mono-service2</string>
    <string>-d:/Users/nvadmin/MacCustomizationWorker</string>
    <string>/Users/nvadmin/MacCustomizationWorker/Worker.Container.exe</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceDescription</key>
<string>Worker Container</string>
<key>WorkingDirectory</key>
<string>/Users/nvadmin/MacCustomizationWorker</string>
</dict>
</plist>

手动运行时启动服务的命令确实可以正常工作

但是它不会在启动时自动启动。有什么帮助吗?我真的很困惑,因为这是我第一次使用 Mac。

答案1

Launchd 是怪异的关于权限。如果没有所有者为 root:wheel,权限设置为 600,无论你如何加载它,或者它里面写了什么,它很可能不会在启动时对该 plist 执行任何操作。在这种情况下,你可能会注意到有关“可疑权限”的日志条目。如果这是问题所在...

sudo chown root:wheel /Library/LaunchDaemons/org.saveusfromlaunchctl.sucks.plist
sudo chmod 600 /Library/LaunchDaemons/org.saveusfromlaunchctl.sucks.plist
sudo launchctl unload -w /Library/LaunchDaemons/org.saveusfromlaunchctl.sucks.plist
sudo launchctl load -w /Library/LaunchDaemons/org.saveusfromlaunchctl.sucks.plist

关于 LaunchDameons 的另一个鲜为人知的事实是,

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

如果你在任何一个 overrides.plist 中有一个条目

<key>org.saveusfromlaunchctl.sucks</key>
    <dict>
        <key>Disabled</key>
        <true/>
    </dict>

那家伙不是绝不即将发射。

答案2

Launchd 期望它启动的程序不是守护进程本身;如果它们这样做,launchd 会将其检测为程序退出,并清理所有子进程(即终止现在守护进程的程序)。根据守护进程的启动和/或保持活动条件,它可能会重新启动它,并一遍又一遍地重复整个过程。在这种情况下,我认为您需要做的就是添加<string>--no-daemon</string>到 ProgramArguments 数组中。

我会进行一些(不太重要的)更改:首先,删除sudo-- 这是不必要的(launchd 会以 root 身份运行守护进程,除非另有指示),如果需要它,它将无法工作(它需要提示输入密码,而守护进程上下文中没有人可用)。其次,密钥WorkingDirectory-d参数似乎做着完全相同的事情;同时使用两者是没有意义的。最后,您可能想要添加<key>KeepAlive</key><true/>,这样如果服务崩溃,它将自动重新启动。

相关内容