Ausführen eines Java-Prozesses von Systemd

15

Ich versuche, ein Shell-Skript von Systemd auszuführen. Das Skript wird problemlos über die Befehlszeile ausgeführt.

Das Skript (runServer.sh) startet einen Java-Prozess und sieht folgendermaßen aus:

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

In /usr/lib/systemd/system(oder /lib/systemd/system/auf anderen Betriebssystemen) habe ich eine Servicedatei erstellt (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

Das Ergebnis

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

Ich versuche:

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
quelle
Und wenn Sie Klasse nicht gefunden Ausnahmen bekommen - werfen Sie einen Blick auf meine Antwort auf SO stackoverflow.com/questions/21503883/… hat ein paar Stunden meines Lebens gedauert, um das dumme Problem herauszufinden ;-(
JGlass

Antworten:

10

Ich bin mir nicht sicher, wer das getan hat.

Ich habe die Lösung gefunden und sie veröffentlicht, um anderen die Mühe zu ersparen.

Was Sie oben sehen, funktioniert. Der endgültige Service ist jedoch:

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

Wichtig ist, dass ich in meinem Shell-Skript den vollständigen Pfad der JAR-Datei eingeben musste. java -jar /home/myprog.jar etc

ie ./myJar.jar hat nicht funktioniert. Ich hoffe, das hilft.

wax_lyrical
quelle
1
Wie rechnen Sie ExecStop ab?
Balaji Boggaram Ramanarayan
STRG + C / SIGINT wird an den Java-Prozess gesendet, wenn Sie den systemd-Dienst beenden. Wenn Ihre App darauf reagiert, ist dies in Ordnung. Nach TimeoutStopSec (Standard: DefaultTimeoutStopSec 90s) wird sigkill
Radu Toader
10

Möglicherweise benötigen Sie das Shell-Skript nicht. Sie können den Vorgang über die Datei myService.service starten, sofern Sie den vollständigen Pfad sowohl zur Java-Binärdatei als auch zur JAR-Datei verwenden. Es sollte ungefähr so ​​aussehen

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

Funktioniert unter CentOS 7.2.

siliconrockstar
quelle
1
Meiner Meinung nach ist dieses Skript einfacher zu pflegen ...
Betlista
4

Werfen Sie einen Blick auf meine Antwort zum Stackoverflow. Dort erfahren Sie, wie Sie einen systemdService für eine Java-Anwendung erstellen :

/programming//a/22121547/272180

yglodt
quelle
1
Danke, Yglodt, dass du meine Texte ausgefüllt hast. Ich habe es vor einem Jahr geschafft, das zu klären, aber wenn Ihr Schreiben jemand anderem hilft, ist das alles gut.
wax_lyrical
1

Dies ist meine systemd-Vorlage für einen Java-Prozess

[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
quelle
0

Ich hatte das gleiche Problem (Code = beendet, Status = 203 / EXEC).

Vergessen Sie nicht, Ihrem Benutzer Skriptausführungsberechtigungen zu erteilen.

Möglicherweise möchten Sie 777 in etwas restriktiveres ändern.

chmod 777 /home/yourscript.sh

oder

chmod u+x /home/yourscript.sh

Dann:

systemctl daemon-reload 
systemctl start yourScript.service 
systemctl enable yourScript.service
Fabatera
quelle
0

Möglicherweise müssen Sie ein WorkingDirectory = hinzufügen, damit es weiß, wo die Dinge ausgeführt werden sollen.

Christopher Pfau
quelle