Chạy một quy trình Java từ Systemd


16

Tôi đang cố gắng thực thi một tập lệnh shell từ systemd. Kịch bản chạy tốt từ dòng lệnh.

Tập lệnh (runServer.sh), chạy một quy trình Java và trông như thế này:

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

Bên trong /usr/lib/systemd/system(hoặc /lib/systemd/system/trên các hệ điều hành khác) Tôi đã tạo một tệp dịch vụ (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

Kết quả

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

Tôi thử:

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)

Và, nếu bạn không tìm thấy trường hợp ngoại lệ - có thể xem câu trả lời của tôi trên SO stackoverflow.com/questions/21503883/. Mất vài giờ trong cuộc đời tôi để tìm ra vấn đề ngu ngốc
;-(

Câu trả lời:


11

Bạn có thể không cần kịch bản shell. Bạn có thể bắt đầu quá trình từ tệp myService.service miễn là bạn sử dụng đường dẫn đầy đủ đến cả tệp nhị phân java và tệp jar. Nó sẽ trông giống như

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

Hoạt động trên CentOS 7.2.


1
ý kiến ​​của tôi là, kịch bản đó dễ duy trì hơn ...
Betlista

10

Không chắc ai đã cho nó một ngón tay cái xuống ..

Tôi tìm thấy giải pháp và đăng nó để tiết kiệm những nỗ lực khác.

Những gì bạn thấy ở trên hoạt động. Tuy nhiên, dịch vụ cuối cùng là như vậy:

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

Điều quan trọng, bên trong tập lệnh shell của tôi, tôi cần đặt vào đường dẫn đầy đủ tệp .jar. java -jar /home/myprog.jar, v.v.

tức là ./myJar.jar không hoạt động. Mong rằng sẽ giúp.


1
Làm thế nào để bạn chiếm tài khoản cho ExecStop?
Balaji Boggaram Ramanarayan

CTRL + C / SIGINT được gửi đến quy trình java khi bạn dừng dịch vụ systemd, nếu ứng dụng của bạn phản hồi điều đó thì tốt, sau TimeoutStopSec (mặc định: DefaultTimeoutStopSec 90s), nó sẽ gửi sigkill
Radu Toader vào

4

Hãy xem câu trả lời của tôi trên stackoverflow để biết chi tiết cách tạo systemddịch vụ cho ứng dụng Java:

/programming//a/22121547/272180


1
Cảm ơn, Yglodt đã điền vào những gì tôi đã viết. Tôi đã cố gắng sắp xếp điều này một năm trước, nhưng nếu bài viết của bạn giúp được ai khác, thì tất cả đều tốt.
wax_lyric

1

Đây là mẫu systemd của tôi cho java một quá trình

[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

Tôi đã có cùng một vấn đề (code = exited, status = 203 / EXEC).

Đừng quên cấp quyền thực thi tập lệnh cho người dùng của bạn.

Bạn có thể muốn thay đổi 777 thành một cái gì đó hạn chế hơn.

chmod 777 /home/yourscript.sh

hoặc là

chmod u+x /home/yourscript.sh

Sau đó:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.