Esecuzione di un processo Java da Systemd


16

Sto cercando di eseguire uno script di shell da systemd. Lo script funziona bene dalla riga di comando.

Lo script (runServer.sh) esegue un processo Java e assomiglia a questo:

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

All'interno /usr/lib/systemd/system(o /lib/systemd/system/su altri sistemi operativi) ho creato un file di servizio (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

Il risultato

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

Cerco:

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)

E, se stai ottenendo eccezioni per la classe non trovata, potresti dare un'occhiata alla mia risposta su SO stackoverflow.com/questions/21503883/… ci sono volute alcune ore della mia vita per capire lo stupido problema
;-(

Risposte:


11

Potrebbe non essere necessario lo script della shell. È possibile avviare il processo dal file myService.service purché si utilizzi il percorso completo del file binario java e del file jar. Dovrebbe assomigliare a qualcosa

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

Funziona su CentOS 7.2.


1
la mia opinione è che la sceneggiatura è più facile da mantenere ...
Betlista,

10

Non sono sicuro di chi abbia dato questo pollice in giù ..

Ho trovato la soluzione e pubblicarla per salvare gli altri.

Quello che vedi sopra funziona. Tuttavia, il servizio finale è quindi:

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

È importante sottolineare che, all'interno del mio script shell, ho dovuto inserire nel percorso completo il file .jar. java -jar /home/myprog.jar ecc

cioè ./myJar.jar non ha funzionato. Spero possa aiutare.


1
Come si tiene conto di ExecStop?
Balaji Boggaram Ramanarayan,

CTRL + C / SIGINT viene inviato al processo java quando si arresta il servizio systemd, se l'app risponde a questo, allora va bene, dopo TimeoutStopSec (impostazione predefinita: DefaultTimeoutStopSec 90s) invierà sigkill
Radu Toader

4

Dai un'occhiata alla mia risposta su StackOverflow che spiega come creare un systemd servizio per un'applicazione Java:

/programming//a/22121547/272180


1
Grazie, Yglodt per aver compilato ciò che ho scritto. Sono riuscito a risolverlo un anno fa, ma se la tua scrittura aiuta qualcun altro, va bene.
wax_lyrical

2

Questo è il mio modello di systemd per java un processo

[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

Ho avuto lo stesso problema (codice = uscito, stato = 203 / EXEC).

Non dimenticare di dare le autorizzazioni di esecuzione dello script al tuo utente.

Potresti voler cambiare 777 in qualcosa di più restrittivo.

chmod 777 /home/yourscript.sh

o

chmod u+x /home/yourscript.sh

Poi:

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

0

Potrebbe essere necessario aggiungere una WorkingDirectory = in modo che sappia da dove eseguire le cose.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.