创建一个作为守护进程运行的简单Hello World工具

时间:2012-03-10 20:22:28

标签: macos cocoa launchd

我在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

那么出了什么问题?

3 个答案:

答案 0 :(得分:3)

只需添加到您的launchd plist

即可
<key>StandardOutPath</key>
<string>/yourpath/sample.log</string>

之后你可以tail -f

更多信息在这里: http://developer.apple.com/library/mac/technotes/tn2083/_index.html#//apple_ref/doc/uid/DTS10003794-CH1-SUBSECTION39

答案 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