1

Я хочу создать "элемент автозагрузки" в OS X. Вся недавняя документация предполагает, что launchd должен быть предпочтительнее, чем традиционные элементы запуска.

Тем не менее, launchd, похоже, ориентирован на запуск реальных демонов, а не на быстрые задачи, которые выполняют свою работу и завершаются. Документ библиотеки разработчика гласит:

Важно: если ваш демон отключается слишком быстро после запуска, launchd может подумать, что он вышел из строя. Демоны, которые продолжают это поведение, могут быть приостановлены и больше не запускаться при поступлении будущих запросов. Чтобы избежать этого, не выключайте компьютер в течение 10 секунд после запуска.

Это создает у меня впечатление, что launchd - это не тот путь. Реализация 10-секундного сна звучит как неаккуратное решение.

По сути, мой вопрос сводится к следующему: как правильно запустить программу "Hello world" при запуске? Здесь запущен не тот инструмент?

1 ответ1

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

... чтобы избежать запуска "очистки" оставшихся подпроцессов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .