Exécution d'un processus Java à partir de Systemd

16

J'essaie d'exécuter un script shell à partir de systemd. Le script s'exécute correctement à partir de la ligne de commande.

Le script (runServer.sh), exécute un processus Java et ressemble à ceci:

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

A l'intérieur /usr/lib/systemd/system(ou /lib/systemd/system/sur d'autres OS) j'ai créé un fichier de service (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

Le résultat

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

J'essaie:

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)
wax_lyrical
la source
Et, si vous obtenez des exceptions de classe non trouvées - jetez un œil à ma réponse sur SO stackoverflow.com/questions/21503883/… a pris quelques heures de ma vie pour comprendre le problème stupide ;-(
JGlass

Réponses:

11

Vous n'avez peut-être pas besoin du script shell. Vous pouvez démarrer le processus à partir du fichier myService.service à condition d'utiliser le chemin d'accès complet au fichier binaire java et au fichier jar. Cela devrait ressembler à quelque chose

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

Fonctionne sur CentOS 7.2.

siliconrockstar
la source
1
mon avis est que ce script est plus facile à maintenir ...
Betlista
10

Je ne sais pas qui a donné un coup de pouce ..

J'ai trouvé la solution et je l'ai publiée pour économiser les efforts des autres.

Ce que vous voyez ci-dessus fonctionne. Cependant, le service final est donc:

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

Surtout, à l'intérieur de mon script shell, j'avais besoin de mettre dans le chemin complet le fichier .jar. java -jar /home/myprog.jar etc

c'est-à-dire que ./myJar.jar n'a pas fonctionné. J'espère que cela pourra aider.

wax_lyrical
la source
1
Comment expliquez-vous ExecStop?
Balaji Boggaram Ramanarayan
CTRL + C / SIGINT est envoyé au processus java lorsque vous arrêtez le service systemd, si votre application y répond, c'est bien, après TimeoutStopSec (par défaut: DefaultTimeoutStopSec 90s), il enverra sigkill
Radu Toader
4

Jetez un oeil à ma réponse sur stackoverflow qui détaille comment créer un systemdservice pour une application Java:

/programming//a/22121547/272180

yglodt
la source
1
Merci, Yglodt d'avoir rempli ce que j'ai écrit. J'ai réussi à régler ça il y a un an, mais si votre écriture aide quelqu'un d'autre, c'est très bien.
wax_lyrical
2

Ceci est mon modèle systemd pour java un processus

[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
Radu Toader
la source
0

J'ai eu le même problème (code = sorti, statut = 203 / EXEC).

N'oubliez pas de donner des autorisations d'exécution de script à votre utilisateur.

Vous voudrez peut-être remplacer 777 par quelque chose de plus restrictif.

chmod 777 /home/yourscript.sh

ou

chmod u+x /home/yourscript.sh

Alors:

systemctl daemon-reload 
systemctl start yourScript.service 
systemctl enable yourScript.service
fabatera
la source
0

Vous devrez peut-être ajouter un WorkingDirectory = pour qu'il sache d'où exécuter les choses.

Christopher Peacock
la source