it-swarm.com.de

Ausführen eines Java-Prozesses von Systemd

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

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

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

Innerhalb von /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)
15
wax_lyrical

Möglicherweise benötigen Sie das Shell-Skript nicht. Sie können den Prozess ü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.

11
siliconrockstar

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

d.h./myJar.jar hat nicht funktioniert. Hoffentlich hilft das.

11
wax_lyrical

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

https://stackoverflow.com/a/22121547/272180

5
yglodt

Dies ist meine Systemvorlage für Java ein 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
1
Radu Toader

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
0
fabatera

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

0