Menjalankan proses Java dari Systemd

16

Saya mencoba menjalankan skrip shell dari systemd. Script berjalan dengan baik dari baris perintah.

Script (runServer.sh), menjalankan proses Java dan terlihat seperti ini:

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

Di dalam /usr/lib/systemd/system(atau /lib/systemd/system/di OS lain) saya telah membuat file layanan (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

Hasil

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

Saya coba:

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
sumber
Dan, jika Anda mendapatkan kelas tanpa pengecualian - mungkin lihat jawaban saya di SO stackoverflow.com/questions/21503883/... butuh beberapa jam dalam hidup saya untuk mencari tahu masalah bodoh ;-(
JGlass

Jawaban:

11

Anda mungkin tidak memerlukan skrip shell. Anda dapat memulai proses dari file myService.service asalkan Anda menggunakan path lengkap ke file biner java dan file jar. Seharusnya terlihat seperti

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

Bekerja pada CentOS 7.2.

siliconrockstar
sumber
1
pendapat saya adalah, skrip itu lebih mudah dipertahankan ...
Betlista
10

Tidak yakin siapa yang memberi ini jempol ..

Saya menemukan solusi dan mempostingnya untuk menyelamatkan upaya orang lain.

Apa yang Anda lihat di atas berfungsi. Namun, layanan terakhir adalah:

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

Yang penting, di dalam skrip shell saya, saya harus meletakkan path lengkap file .jar. java -jar /home/myprog.jar dll

yaitu ./myJar.jar tidak bekerja. Semoga itu bisa membantu.

wax_lyrical
sumber
1
Bagaimana Anda menjelaskan ExecStop?
Balaji Boggaram Ramanarayan
CTRL + C / SIGINT dikirim ke proses java ketika Anda menghentikan layanan systemd, jika aplikasi Anda meresponsnya maka itu baik, setelah TimeoutStopSec (default: DefaultTimeoutStopSec 90s) ia akan mengirimkan sigkill
Radu Toader
4

Lihatlah jawaban saya di stackoverflow yang merinci cara membuat systemdlayanan untuk aplikasi Java:

/programming//a/22121547/272180

yglodt
sumber
1
Terima kasih, Yglodt untuk mengisi apa yang saya tulis. Saya berhasil menyelesaikan masalah ini setahun yang lalu, tetapi jika tulisan Anda membantu orang lain, itu bagus.
wax_lyrical
2

Ini adalah templat systemd saya untuk proses java

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

Saya memiliki masalah yang sama (kode = keluar, status = 203 / EXEC).

Jangan lupa untuk memberikan izin eksekusi skrip kepada pengguna Anda.

Anda mungkin ingin mengubah 777 ke sesuatu yang lebih ketat.

chmod 777 /home/yourscript.sh

atau

chmod u+x /home/yourscript.sh

Kemudian:

systemctl daemon-reload 
systemctl start yourScript.service 
systemctl enable yourScript.service
fabatera
sumber
0

Anda mungkin perlu menambahkan WorkingDirectory = sehingga ia tahu dari mana harus menjalankan sesuatu.

Christopher Peacock
sumber