Systemd에서 Java 프로세스 실행


16

systemd에서 쉘 스크립트를 실행하려고합니다. 스크립트는 명령 행에서 제대로 실행됩니다.

스크립트 (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/다른 OS)에서 서비스 파일 (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/... ;-( 바보 같은 문제를 알아 내기 위해 내 인생의 몇 시간이 걸렸다
JGlass

답변:


11

쉘 스크립트가 필요하지 않을 수 있습니다. 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

중요한 것은 쉘 스크립트 안에 .jar 파일의 전체 경로를 넣어야한다는 것입니다. 자바 -jar /home/myprog.jar 등

즉 ./myJar.jar이 작동하지 않았습니다. 희망이 도움이됩니다.


1
ExecStop을 어떻게 설명합니까?
Balaji Boggaram Ramanarayan

(: DefaultTimeoutStopSec의 90 년대를 기본값)은 SIGKILL 보낼 것입니다 당신이 그에게 응답 app 해당하는 경우 그 다음 좋은 당신이 TimeoutStopSec 후에는 systemd 서비스를 중지 할 때 CTRL + C / SIGINT는 자바 프로세스에 보내진다
라두 Toader

4

systemdJava 응용 프로그램에 대한 서비스 를 만드는 방법을 자세히 설명하는 stackoverflow에 대한 답변을 살펴보십시오 .

/programming//a/22121547/272180


1
내가 쓴 것을 작성해 주셔서 감사합니다. 나는 1 년 전에 이것을 정리할 수 있었지만, 당신의 글이 다른 사람을 돕는다면 모두 좋습니다.
wax_lyrical

2

이것은 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

0

나는 같은 문제가 있었다 (code = exited, status = 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.