Создание простого инструмента Hello World, который запускается как демон - PullRequest
3 голосов
/ 11 марта 2012

Я создал шаблон инструмента командной строки (Foundation) в XCode.Он просто записывает «Hello World» на консоль. В нем есть только один класс main.m.Вот код:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])

{

   @autoreleasepool {

       // insert code here...
       NSLog(@"Hello, World!");

   }
   return 0;

}

Теперь я хочу запустить его как демон и записать «Hello World«к консоли каждые 10 секунд.Поэтому я переместил продукт / двоичный файл на / tmp на моем Mac.Я создал следующий plist для launchd:

<?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>

Я загрузил plist с помощью launchctl, но я не вижу "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 ]

3 голосов
/ 02 мая 2012

Просто добавьте в свой список запуска

<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

2 голосов
/ 12 марта 2012

NSLog не работает, потому что когда вы запускаете демон-процесс, к нему не прикрепляются стандартные сокеты io или файловые дескрипторы.Они должны быть специально выделены.Хороший ресурс о том, как создать правильного демона и как написать консоль и системный журнал, представлен в книге «Расширенное программирование в Mac OS X (глава 20)», написанной Dalrymple & Hillegass.

Они определили скелетную программуон затрагивает проблемы, которые вы выделяете. Я вспомнил, что читал это некоторое время назад и подумал, что, возможно, когда-нибудь мне это понадобится. Авторы показывают пример использования библиотеки syslog.h с использованием openlog () и syslog () для простых коммуникаций.также показать некоторые другие методы более низкого уровня для связи с файлами и даже сокетами (для серверов и т. д.).

Я всегда ценю, когда кто-то может сказать мне, как сделать что-то, а не ссылаться на что-то, но в этом случае этолучшее, что я могу сделать. удачи.

1 голос
/ 13 ноября 2015

С помощью следующих ключей в файле plist я получаю большинство журналов. Но иногда я путаюсь, если получаю все выходные данные NSLog в файле журнала. Мне кажется, что когда-нибудь пропущена какая-то строка логов.

Я не уверен, что все NSLog выходные данные LaunchDaemon зарегистрированы или некоторые пропущены из-за системного приоритета.

<key>StandardOutPath</key>
                <string>/var/log/mydaemon.log</string>
        <key>StandardErrorPath</key>
                <string>/var/log/mydaemon.log</string>
...