Systemd'den Java işlemi çalıştırma


16

Systemd bir kabuk komut dosyası yürütmek çalışıyorum. Komut dosyası, komut satırından iyi çalışır.

Komut dosyası (runServer.sh), bir Java işlemi çalıştırır ve şöyle görünür:

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

İçeride /usr/lib/systemd/system(veya /lib/systemd/system/diğer işletim sistemlerinde) bir hizmet dosyası (myService.service) oluşturdum:

[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

Sonuç

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

Denerim:

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)

Ve eğer sınıfta istisnalar bulunmuyorsa - SO stackoverflow.com/questions/21503883/… adresindeki cevabım bir göz atabilir, aptal sorunu
çözmek

Yanıtlar:


11

Kabuk betiğine ihtiyacınız olmayabilir. Hem java ikili dosyasına hem de jar dosyasına giden tam yolu kullanmanız koşuluyla, işlemi myService.service dosyasından başlatabilirsiniz. Gibi bir şey olmalı

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

CentOS 7.2 üzerinde çalışır.


1
benim düşüncem, bu komut dosyasının bakımı daha kolay ...
Betlista

10

Kimin bir başparmak verdi emin değilim ..

Çözümü buldum ve başkalarının çabalarını kurtarmak için postaladım.

Yukarıda gördükleriniz işe yarıyor. Ancak, nihai hizmet şu şekildedir:

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

Önemlisi, benim kabuk komut dosyası içinde, .jar dosyasının tam yolunu koymak gerekiyordu. java -jar /home/myprog.jar vb.

yani ./myJar.jar çalışmadı. Umarım yardımcı olur.


1
ExecStop'u nasıl hesaplarsınız?
Balaji Boggaram Ramanarayan

CTRL + C / SIGINT java işlemine sistemd hizmetini durdurduğunuzda gönderilir, eğer uygulama buna yanıt verirse iyi olur, TimeoutStopSec'ten (varsayılan: DefaultTimeoutStopSec 90s) sigkill gönderir
Radu Toader

4

systemdJava uygulaması için bir hizmetin nasıl oluşturulacağını ayrıntılarıyla açıklayan stackoverflow'daki cevabıma bir göz atın :

/programming//a/22121547/272180


1
Yglodt yazdığımı doldurduğunuz için teşekkürler. Bunu bir yıl önce halletmeyi başardım, ancak yazınız başkalarına yardım ederse, hepsi iyi.
wax_lyrical

2

Bu benim java bir süreç için benim sistem şablonu

[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

Aynı sorunu yaşadım (kod = çıkıldı, durum = 203 / EXEC).

Kullanıcıya komut dosyası yürütme izinleri vermeyi unutmayın.

777'yi daha kısıtlayıcı bir şeye değiştirmek isteyebilirsiniz.

chmod 777 /home/yourscript.sh

veya

chmod u+x /home/yourscript.sh

Sonra:

systemctl daemon-reload 
systemctl start yourScript.service 
systemctl enable yourScript.service

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.