Estoy intentando configurarTu seguimientoen OS X Lion Server y ejecutarlo al arrancar usando launchd
. He descargado el archivo jar de YouTrack que puedo ejecutar correctamente desde la línea de comandos usando java -Xmx512m -jar youtrack.jar 8080
. También he incluido dicho comando de ejecución en un script de shell similar aesteque básicamente me permite interactuar con la instancia activa usando youtrack start
y youtrack stop
. Almacena la identificación del proceso java
en un archivo y las salidas para poder detener una instancia en ejecución, permitiendo solo una instancia, etc.
Para ejecutar este comando en el momento del arranque, creé un plist de lanzamiento simple y lo coloqué en /Library/LaunchDaemons, según las instrucciones proporcionadas en man launchd.plist
. Las claves principales utilizadas son ProgramArguments
( youtrack start
) y RunAtLoad
(verdadero). El problema es que, cuando se ejecuta desde la línea de comando, youtrack start
se crea un archivo que contiene el pid del java
proceso y puedo ver este proceso en top
o ps ax
. Pero cuando lanuchd ( ) ejecuta el comando, sudo launchctl load /Library/LaunchDaemons/org.example.youtrack.plist
el pid resultante no coincidirá con el de ningún proceso en ejecución y el servidor web de YouTrack no se iniciará. Es casi como si el proceso java iniciado por launchd también terminara una vez que launchd haya finalizado.
Sin embargo, si simplemente pongo el comando java directamente en la lista de lanzamiento, funcionará bien. Simplemente me gustaría entender por qué es así: pensé que la idea de launchd era iniciar demonios. ¿Pero eso significa que el demonio debe ejecutarse dentro de launchd durante toda su vida útil? ¿Existe una forma alternativa de iniciar demonios con (o sin) launchd, que me permita simplemente ejecutar un comando una vez al arrancar? Básicamente lo que solíamos hacer @roboot
en cron
versiones anteriores de OS X.
Respuesta1
Launchd no sólo lanza programas, sino que los monitorea mientras se ejecutan. De forma predeterminada, espera que los programas sigan ejecutándose (como demonios), no que inicien ningún otro programa (/copia en segundo plano de ellos mismos/lo que sea) y salgan. Si el programa se cierra, launchd hace dos cosas que pueden causar problemas en un programa de ejecución y salida, como youtrack start
: "limpiará" los subprocesos sobrantes (como el proceso del servidor real) y (dependiendo de otras configuraciones) tal vez Vuelva a intentar el programa "fallido". Hay dos formas de solucionar esto:
Hágalo de la manera iniciada: haga que el elemento iniciado se ejecute
java -Xmx512m -jar youtrack.jar 8080
directamente (tenga en cuenta que cada "palabra" del comando debe ser un elemento separado de laProgramArguments
matriz). Si agrega<key>KeepAlive</key><true/>
a launchd .plist, reiniciará el servidor si falla o se cierra por cualquier motivo (tenga en cuenta que esto incluye ser eliminado, por lo que debe reescribirloyoutrack stop
para usarlolaunchctl unload ...
y dejar que launchd lo elimine).Dígale a launchd que no espere que siga ejecutándose y que no elimine los subprocesos. Agregue esto a su .plist para desactivar el comportamiento predeterminado:
<key>KeepAlive</key> <false/> <key>AbandonProcessGroup</key> <true/>