Ausführen – oder nur Starten – eines Daemons mit launchd

Ausführen – oder nur Starten – eines Daemons mit launchd

Ich versuche einzurichtenYouTrackauf OS X Lion Server und lasse es beim Booten mit starten launchd. Ich habe die YouTrack-JAR-Datei heruntergeladen, die ich erfolgreich über die Befehlszeile mit ausführen kann java -Xmx512m -jar youtrack.jar 8080. Ich habe den besagten Run-Befehl auch in ein Shell-Skript ähnlich wie verpacktDasyoutrack startwodurch ich grundsätzlich mit und mit der aktiven Instanz interagieren kann youtrack stop. Es speichert die Prozess-ID des javaProzesses in einer Datei und beendet ihn, um eine laufende Instanz stoppen zu können, lässt nur eine Instanz zu usw.

Um diesen Befehl beim Booten auszuführen, habe ich eine einfache launchd plist erstellt und sie gemäß den Anweisungen in in /Library/LaunchDaemons abgelegt man launchd.plist. Die hauptsächlich verwendeten Schlüssel sind ProgramArguments( youtrack start) und RunAtLoad(true). Das Problem ist, dass beim Ausführen über die Befehlszeile youtrack starteine Datei mit der PID des Prozesses erstellt wird und ich diesen Prozess in oder javasehen kann . Aber wenn der Befehl von lanuchd ( ) ausgeführt wird, stimmt die resultierende PID nicht mit der eines laufenden Prozesses überein und der YouTrack-Webserver startet nicht. Es ist fast so, als würde der von launchd gestartete Java-Prozess auch beendet, sobald launchd fertig ist.topps axsudo launchctl load /Library/LaunchDaemons/org.example.youtrack.plist

Wenn ich den Java-Befehl jedoch stattdessen einfach direkt in die Launchd-Plist eingebe, funktioniert es einwandfrei. Ich würde einfach gerne verstehen, warum das so ist – ich dachte, die ganze Idee von Launchd sei, Daemons zu starten. Aber heißt das, dass der Daemon während seiner gesamten Lebensdauer in Launchd laufen muss? Gibt es eine alternative Möglichkeit, Daemons mit (oder ohne) Launchd zu starten, die es mir ermöglichen würde, einfach einmal beim Booten einen Befehl auszuführen? Im Grunde das, was wir in früheren Versionen von OS X gemacht @roboothaben cron.

Antwort1

Launchd startet nicht nur Programme, sondern überwacht sie auch während der Ausführung. Standardmäßig erwartet es, dass die Programme weiterlaufen (als Daemons) und nicht ein anderes Programm (/eine Hintergrundkopie von sich selbst/was auch immer) starten und beendet werden. Wenn das Programm beendet wird, führt launchd zwei Dinge aus, die bei einem Programm, das ausgeführt und beendet wird, Probleme verursachen können youtrack start: Es „räumt“ übrig gebliebene Unterprozesse auf (wie den eigentlichen Serverprozess) und (je nach anderen Einstellungen) versucht es möglicherweise erneut mit dem „fehlgeschlagenen“ Programm. Es gibt zwei Möglichkeiten, dies zu lösen:

  1. Machen Sie es wie bei launchd: Lassen Sie das launchd-Element java -Xmx512m -jar youtrack.jar 8080direkt ausführen (beachten Sie, dass jedes „Wort“ des Befehls ein separates Element des ProgramArgumentsArrays sein sollte). Wenn Sie <key>KeepAlive</key><true/>der launchd .plist etwas hinzufügen, wird der Server neu gestartet, wenn er abstürzt oder aus irgendeinem Grund beendet wird (beachten Sie, dass dies auch das Beenden einschließt, Sie sollten es also umschreiben youtrack stopund launchctl unload ...launchd das Beenden übernehmen lassen).

  2. Sagen Sie launchd, dass es nicht weiterlaufen soll und keine Unterprozesse beenden soll. Fügen Sie dies zu Ihrer .plist hinzu, um das Standardverhalten abzuschalten:

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

verwandte Informationen