【发布时间】:2012-03-10 20:22:27
【问题描述】:
我在 Xcode 中构建了命令行工具 (Foundation) 模板。它只是将“Hello World”记录到控制台。main.m 中只有一个类。代码如下:
#import <Foundation/Foundation.h> int main (int argc, const char * argv[]){
@autoreleasepool { // insert code here... NSLog(@"Hello, World!"); } return 0;}
现在我想将它作为守护进程运行,并每 10 秒将“Hello World”记录到控制台。所以我将产品/二进制文件移到了我的 Mac 上的 /tmp 中。我为 launchd 创建了以下 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>helloDaemon</string>
<key>ProgramArguments</key>
<array>
<string>/tmp/helloDaemon</string>
</array>
<key>StartInterval</key>
<integer>10</integer>
</dict>
</plist>
我使用 launchctl 加载了 plist,但在控制台中看不到任何“Hello World”。相反,我得到了这个:
11/03/2012 00:55:35.141 com.apple.launchd: (helloDaemon) Throttling respawn: Will start in 1 seconds
11/03/2012 00:55:45.141 com.apple.launchd: (helloDaemon) Throttling respawn: Will start in 2 seconds
11/03/2012 00:55:55.140 com.apple.launchd: (helloDaemon) Throttling respawn: Will start in 3 seconds
那么到底出了什么问题?
【问题讨论】:
-
你在哪里安装了launchd plist?
-
@RobKeniger 我使用
launchctl来安装plist。此外,当我以 root 用户身份(使用 sudo)加载它时,它应该已经安装在 /Library/LaunchDaemons 中。但是好吧,我的 plist 没有复制到那个目录中(我认为只有在重新启动时启动的守护进程才会放在那里)。所以我手动将它复制到/Library/LaunchDaemons,但仍然没有运气。 -
@RobKeniger 但我认为它是由launchctl正确加载的。当我输入
sudo launchctl list时,它会列出我的守护进程,状态为 0。 -
好的,显然我的守护进程正在工作。我没有将日志记录到控制台,而是将输出定向到一个文件,并且它起作用了。所以出于某种原因,
NSLogs 不起作用。