configurar el demonio java con systemd

configurar el demonio java con systemd

Estoy usando esta definición para un systemdtrabajo:

 [Unit]
 Description=Some job

 [Service]
 ExecStart=/usr/local/sbin/somejob
 User=dlt
 Type=forking

 [Install]
 WantedBy=multi-user.target

El script se llama de la siguiente manera (llamando a una rutina simple que escucha en un socket tcpip y agrega la entrada a un archivo):

 #!/bin/sh

 cd /home/user/tmp/testout
 nohup java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar </dev/null >/dev/null &

Después de que systemctl start somejobel proceso se muestre como en ejecución, con initcomo padre:

 user@CANTANDO ~$ ps -u dlt eo pid,ppid,command
   PID  PPID COMMAND
  8718     1 java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar

Después de realizar systemctl stop somejobel proceso ya no aparece (y el puerto está cerrado).

Entonces todo parece estar bien y elegante.

Mi pregunta es: ¿Es esta unasolución aceptablepara ejecutar un demonio de Java con systemd, ¿o hay advertencias y, por lo tanto, otras formas más estables o seguras de lograrlo?

Respuesta1

Aquí hay algunas modificaciones menores:

  1. Dado que escucha en un socket de red, conviértalo en una dependencia de network.target.
  2. nohupno es necesario ya que systemddemonizará el ejecutable por usted.
  3. Creo que un script de shell separado sería excesivo, así que simplemente combínalo en el archivo de servicio.
  4. La redirección ( < /dev/nully demás) no es necesaria ya que systemd configura un contexto de E/S estándar apropiado. De hecho, si tomas la redirecciónafuerasystemd registrará todo lo que el programa Java envíe a la salida estándar en su diario, sin necesidad de ningún mecanismo de registro especial.
  5. &No es necesario ni apropiado ejecutar de forma asincrónica desde el shell de invocación ( ).
  6. Hay un patrón de comportamiento específico requerido por Type=forking, y si el demonio no lo sigue, las cosas van mal. Así que prueba con Type=simple(o Type=notify).

Entonces el archivo de servicio se ve así:

[Unit]
Description=Some job
After=network.target

[Service]
WorkingDirectory=/home/user/tmp/testout
SyslogIdentifier=SocketTest
ExecStart=/bin/sh -c "exec java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar"
User=dlt
Type=simple

[Install]
WantedBy=multi-user.target

Notas:

  1. No puede simplemente usarlo javacomo el nombre del programa a ejecutar. systemd no busca PATHejecutables y el nombre del ejecutable asignado ExecStartdebe ser absoluto. Entonces, si desea buscar una ruta, debe invocarla a través de un shell o /usr/bin/env. Elegimos /bin/shaquí.
  2. Debido a que este es Type=simpleel shell, execJava debe ejecutarlo, no como un proceso secundario. systemd controla el servicio a través del proceso principal, y ese debe ser Java, no un proceso de shell principal.
  3. Debido a que esto no invoca el ejecutable de Java directamente, systemd pondrá el nombre shen su diario como nombre del servicio. VerCómo evitar que /usr/bin/env se marque en los registros de systemd como ejecutablepara más información sobre esto.

Hasta donde yo sé, no hay ninguna advertencia especial al ejecutar una aplicación Java con Systemd.

información relacionada