2

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

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

Тем не менее, если я вместо этого просто помещу команду java непосредственно в файл launchd plist, она будет работать нормально. Я просто хотел бы понять, почему это так - я думал, что в то время идея запуска состояла в том, чтобы запускать демоны. Но значит ли это, что демон должен работать внутри launchd в течение всей его жизни? Есть ли альтернативный способ запуска демонов с (или без) launchd, который позволил бы мне просто выполнить команду один раз при загрузке? В основном то, что мы использовали, используя @roboot в cron в более ранних версиях OS X.

1 ответ1

6

Launchd не просто запускает программы, он отслеживает их во время работы. По умолчанию он ожидает, что программы будут продолжать работать (как демоны), не запускать какую-либо другую программу (/ фоновую копию себя / что угодно) и завершать работу. Если программа завершает работу, launchd делает две вещи, которые могут вызвать проблемы для программы запуска и выхода, такой как 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/>
    

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