从Systemd运行Java进程


16

我正在尝试从systemd执行shell脚本。该脚本可以从命令行正常运行。

脚本(runServer.sh)运行Java进程,如下所示:

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

在内部/usr/lib/systemd/system(或/lib/systemd/system/在其他操作系统上),我创建了一个服务文件(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

结果

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

我尝试:

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)

并且,如果您正在上课,则找不到异常-可以在SO stackoverflow.com/questions/21503883/上查看我的答案
……

Answers:


11

您可能不需要shell脚本。如果您同时使用java二进制文件和jar文件的完整路径,则可以从myService.service文件启动该过程。它看起来应该像

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

在CentOS 7.2上工作。


1
我的观点是,该脚本更易于维护...
Betlista

10

不知道是谁对此表示反对。

我找到了解决方案并将其发布,以节省他人的精力。

您上面看到的有效。但是,最终的服务是:

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

重要的是,在我的shell脚本中,我需要将.jar文件放入完整路径。java -jar /home/myprog.jar等

即./myJar.jar无法正常工作。希望能有所帮助。


1
您如何计算ExecStop?
Balaji Boggaram Ramanarayan

当您停止systemd服务时,将CTRL + C / SIGINT发送到Java进程,如果您的应用程序对此做出响应,则表示它是好的,在TimeoutStopSec(默认值:DefaultTimeoutStopSec 90s)之后,它将发送sigkill
Radu Toader

4

看一下我对stackoverflow的回答,其中详细介绍了如何systemd为Java应用程序创建服务:

/programming//a/22121547/272180


1
谢谢,Yglodt填写了我写的内容。一年前,我确实设法解决了这个问题,但是如果您的著作对其他人有帮助,那就太好了。
wax_lyrical

2

这是我的java进程的systemd模板

[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

我遇到了同样的问题(代码已退出,状态为203 / EXEC)。

不要忘记将脚本执行权限授予用户。

您可能需要将777更改为更具限制性的内容。

chmod 777 /home/yourscript.sh

要么

chmod u+x /home/yourscript.sh

然后:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.