Ejecutar (o simplemente iniciar) un demonio usando launchd

Ejecutar (o simplemente iniciar) un demonio usando launchd

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 starty youtrack stop. Almacena la identificación del proceso javaen 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 startse crea un archivo que contiene el pid del javaproceso y puedo ver este proceso en topo ps ax. Pero cuando lanuchd ( ) ejecuta el comando, sudo launchctl load /Library/LaunchDaemons/org.example.youtrack.plistel 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 @robooten cronversiones 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:

  1. Hágalo de la manera iniciada: haga que el elemento iniciado se ejecute java -Xmx512m -jar youtrack.jar 8080directamente (tenga en cuenta que cada "palabra" del comando debe ser un elemento separado de la ProgramArgumentsmatriz). 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 reescribirlo youtrack stoppara usarlo launchctl unload ...y dejar que launchd lo elimine).

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

información relacionada