Запуск (или только запуск) демона с помощью launchd

Запуск (или только запуск) демона с помощью launchd

Я пытаюсь настроитьYouTrackна OS X Lion Server и запустить его при загрузке с помощью launchd. Я загрузил файл JAR YouTrack, который я могу успешно запустить из командной строки с помощью java -Xmx512m -jar youtrack.jar 8080. Я также обернул указанную команду запуска в скрипт оболочки, похожий наэтотчто в основном позволяет мне взаимодействовать с активным экземпляром с помощью youtrack startи youtrack stop. Он сохраняет идентификатор процесса javaв файле и выходы, чтобы иметь возможность остановить работающий экземпляр, разрешая только один экземпляр и т. д.

Чтобы запустить эту команду во время загрузки, я создал простой файл launchd plist и поместил его в /Library/LaunchDaemons, как указано в инструкциях в man launchd.plist. Основные используемые ключи — ProgramArguments( youtrack start) и RunAtLoad(true). Проблема в том, что при запуске из командной строки youtrack startбудет создан файл, содержащий pid процесса java, и я могу видеть этот процесс в topили ps ax. Но когда команда запускается с помощью lanuchd ( sudo launchctl load /Library/LaunchDaemons/org.example.youtrack.plist), полученный pid не будет соответствовать pid ни одного из запущенных процессов, и веб-сервер YouTrack не запустится. Это почти как если бы процесс java, запущенный launchd, также завершился после завершения launchd.

Однако если я вместо этого просто помещу команду java непосредственно в launchd plist, то она будет работать нормально. Я просто хотел бы понять, почему это так — я думал, что идея запуска заключается в запуске демонов. Но означает ли это, что демон должен работать внутри launchd в течение всего своего жизненного цикла? Есть ли альтернативный способ запуска демонов с помощью (или без) launchd, который позволит мне просто запустить команду один раз при загрузке? По сути, то, что мы делали с помощью @robootin cronв более ранних версиях OS X.

решение1

Launchd не просто запускает программы, он отслеживает их работу. По умолчанию он ожидает, что программы продолжат работать (как демоны), а не запустят какую-то другую программу (/фоновую копию себя/что угодно) и завершат работу. Если программа завершается, launchd делает две вещи, которые могут вызвать проблемы для программы run-and-exit, например youtrack start: он «очистит» оставшиеся подпроцессы (например, сам серверный процесс) и (в зависимости от некоторых других настроек) может повторить «ошибочную» программу. Есть два способа решить эту проблему:

  1. Сделайте это способом launchd: запустите элемент launchd java -Xmx512m -jar youtrack.jar 8080напрямую (обратите внимание, что каждое «слово» команды должно быть отдельным элементом массива ProgramArguments). Если вы добавите <key>KeepAlive</key><true/>в launchd .plist, он перезапустит сервер, если он выйдет из строя или завершит работу по любой причине (обратите внимание, что это включает в себя завершение работы, поэтому вам следует переписать его youtrack stopдля использования launchctl unload ...и позволить launchd выполнить завершение работы).

  2. Скажите launchd не ожидать продолжения работы и не завершать подпроцессы. Добавьте это в свой .plist, чтобы отключить поведение по умолчанию:

    <key>KeepAlive</key>
    <false/>
    <key>AbandonProcessGroup</key>
    <true/>
    

Связанный контент