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)

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.


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.


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


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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.