Ejecutar un proceso Java desde Systemd


16

Estoy tratando de ejecutar un script de shell desde systemd. El script se ejecuta bien desde la línea de comando.

El script (runServer.sh) ejecuta un proceso Java y tiene este aspecto:

#!/bin/bash
java -jar -Dresources=/home/pruss/dev/ServerDeploy5-4.1/Server/resources/MyServer.jar "0" "Test"

Dentro /usr/lib/systemd/system(o /lib/systemd/system/en otros sistemas operativos) he creado un archivo de servicio (myService.service):

[Unit]
Description=My Servers service
[Service]
ExecStart=/home/pruss/dev/ServerDeploy5-4.1/Server/runServer.sh
User=root
Type=oneshot
[Install]
WantedBy=multi-user.target

El resultado

Job for myService.service failed. See "systemctl status myService.service" and "journalctl -xn" for details.

Lo intento:

systemctl status myService.service


   Loaded: loaded (/usr/lib/systemd/system/myService.service; disabled)
   Active: failed (Result: exit-code) since Thu 2015-07-23 12:27:38 BST; 26s ago
   Main PID: 28413 (code=exited, status=203/EXEC)

Y, si está obteniendo excepciones de clase no encontrada, podría echar un vistazo a mi respuesta en SO stackoverflow.com/questions/21503883/... tomó algunas horas de mi vida para resolver el estúpido problema ;-(
JGlass

Respuestas:


11

Es posible que no necesite el script de shell. Puede iniciar el proceso desde el archivo myService.service, siempre que utilice la ruta completa al archivo binario de Java y al archivo jar. Debería verse algo así como

ExecStart=/usr/bin/java -jar /home/pruss/dev/ServerDeploy5-4.1/Server/resources/MyServer.jar

Funciona en CentOS 7.2.


1
mi opinión es que ese guión es más fácil de mantener ...
Betlista

10

No estoy seguro de quién le dio un pulgar hacia abajo ...

Encontré la solución y la publiqué para ahorrarle el esfuerzo a otros.

Lo que ves arriba funciona. Sin embargo, el servicio final es así:

[Unit]
Description=MyProgramThing
[Service]
ExecStart=/home/prus/dev/Blah-4.1/Server/runServer.sh
Type=simple
User=prus
[Install]
WantedBy=multi-user.target

Es importante destacar que, dentro de mi script de shell, necesitaba poner en la ruta completa el archivo .jar. java -jar /home/myprog.jar etc.

es decir ./myJar.jar no funcionó. Espero que ayude.


1
¿Cómo contabiliza ExecStop?
Balaji Boggaram Ramanarayan

CTRL + C / SIGINT se envía al proceso de Java cuando detiene el servicio systemd, si su aplicación responde a eso, entonces es bueno, después de TimeoutStopSec (predeterminado: DefaultTimeoutStopSec 90s) enviará sigkill
Radu Toader

4

Eche un vistazo a mi respuesta en stackoverflow que detalla cómo crear un systemdservicio para una aplicación Java:

/programming//a/22121547/272180


1
Gracias, Yglodt por completar lo que escribí. Me las arreglé para resolver esto hace un año, pero si tu escritura ayuda a alguien más, eso está bien.
wax_lyrical

2

Esta es mi plantilla systemd para java un proceso

[Unit]
Description=Spring MVC Java Service

[Service]
User=spring-mvc
# The configuration file application.properties should be here:
WorkingDirectory=/usr/local/spring-mvc


# Run ExecStartPre with root-permissions
PermissionsStartOnly=true

ExecStartPre=-/bin/mkdir -p /var/log/spring-mvc


ExecStartPre=/bin/chown -R spring-mvc:syslog /var/log/spring-mvc
ExecStartPre=/bin/chmod -R 775 /var/log/spring-mvc


Environment="ENV=stage"

#https://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStart=
ExecStart=/usr/bin/java \
        -Dlog4j.configurationFile=log4j2-spring.xml \
        -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector \
        -Dspring.profiles.active=stage \
        -Denvironment-type=stage \
        -XX:+UseConcMarkSweepGC \
        -XX:CMSInitiatingOccupancyFraction=80 \
        -XX:NewSize=756m \
        -XX:MetaspaceSize=256m \
        -Dsun.net.inetaddr.ttl=5 \
        -Xloggc:/var/log/spring-mvc/gc.log \
        -verbose:gc \
        -verbosegc \
        -XX:+DisableExplicitGC \
        -XX:+PrintGCDetails \
        -XX:+PrintGCDateStamps \
        -XX:+PreserveFramePointer \
        -XX:+StartAttachListener \
        -Xms768m \
        -Xmx768m \
        -XX:+HeapDumpOnOutOfMemoryError \
        -jar spring-mvc.war

SuccessExitStatus=143
StandardOutput=journal
StandardError=journal


KillSignal=SIGINT
TimeoutStopSec=20
Restart=always
RestartSec=5
StartLimitInterval=0
StartLimitBurst=10

LimitNOFILE=500000
LimitNPROC=500000

#https://www.freedesktop.org/software/systemd/man/systemd.exec.html#LimitCPU=
#LimitCPU=, LimitFSIZE=, LimitDATA=, LimitSTACK=, LimitCORE=, LimitRSS=, LimitNOFILE=, LimitAS=, LimitNPROC=, LimitMEMLOCK=, LimitLOCKS=, LimitSIGPENDING=, LimitMSGQUEUE=, LimitNICE=, LimitRTPRIO=, LimitRTTIME=¶

SyslogIdentifier=spring-mvc

[Install]
WantedBy=multi-user.target


# https://www.freedesktop.org/software/systemd/man/journalctl.html
#check logs --- journalctl -u spring-mvc -f -o cat

0

Tuve el mismo problema (código = salido, estado = 203 / EXEC).

No olvide otorgar permisos de ejecución de script a su usuario.

Es posible que desee cambiar 777 a algo más restrictivo.

chmod 777 /home/yourscript.sh

o

chmod u+x /home/yourscript.sh

Luego:

systemctl daemon-reload 
systemctl start yourScript.service 
systemctl enable yourScript.service

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.