我想在 os x 中创建一个“启动项”。所有最近的文档都表明 launchd 应该比传统的启动项更受欢迎。
然而,launchd 似乎更适合启动实际的守护进程,而不是快速完成工作并退出的任务。开发者库文档说:
重要的:如果您的守护进程在启动后关闭得太快,launchd 可能会认为它已崩溃。继续此行为的守护进程可能会被暂停,并且不会在将来的请求到达时再次启动。为避免此行为,请勿在启动后至少 10 秒内关闭。
这给我的印象是 launchd 不是解决问题的办法。实现 10 秒休眠听起来是个草率的解决方案。
本质上,我的问题可以归结为:在启动时运行“Hello world”程序的正确方法是什么? launchd 在这里是错误的工具吗?
答案1
除非您需要兼容旧版本的 OS X(即 10.3 或更早版本),否则我会使用 LaunchDaemon。守护进程退出过快的问题只有在 launchd 应该重新启动守护进程时才会成为问题。如果我理解您的情况,那么这并不重要。我使用 LaunchDaemon 而不是 StartupItem 的原因是启动过程将等待 StartupItems 完成;我还没有对此进行很好的测试,但我的印象是,即使一个相当快的 StartupItem 也会显著减慢启动过程。
因此,我会使用 LaunchDaemon。只需确保其 .plist 包含以下内容:
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<false/>
如果您的程序产生了任何需要在父进程退出后继续运行的子进程,您还应该包括:
<key>AbandonProcessGroup</key>
<true/>
...以防止 launchd “清理”剩余的子进程。