我在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
那么出了什么问题?
答案 0 :(得分:3)
只需添加到您的launchd plist
即可<key>StandardOutPath</key>
<string>/yourpath/sample.log</string>
之后你可以tail -f
。
答案 1 :(得分:2)
NSLog无法正常工作,因为当您启动恶魔进程时,它没有附加任何标准的io套接字或文件句柄。他们必须专门分配。 Dalrymple&amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; Hillegass。
他们定义了一个骨架程序来解决您突出显示的io问题。我记得不久前读过它,并认为有一天我可能需要它。作者使用openlog()和syslog()使用syslog.h lib进行简单通信。他们还展示了一些其他低级方法,用于与文件甚至套接字(服务器等)进行通信。
当有人能告诉我如何做某事而不是引用某些东西时,我总是很感激,但在这种情况下,这是我能做的最好的事情。祝你好运。
答案 2 :(得分:1)
使用plist
文件中的以下键,我可以获得大部分日志。但有时候如果我在日志文件中获得所有NSLog
输出,我会感到困惑。对我来说,有时似乎缺少一些日志行。
我不确定是否记录了NSLog
的所有LaunchDaemon
输出,或者由于系统优先级而忽略了一些<key>StandardOutPath</key>
<string>/var/log/mydaemon.log</string>
<key>StandardErrorPath</key>
<string>/var/log/mydaemon.log</string>
输出。
id