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
私の意見では、そのスクリプトは保守が容易です...
ベトリスタ

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ファイルのフルパスを指定する必要があったことです。java -jar /home/myprog.jarなど

つまり、。/ myJar.jarは機能しませんでした。お役に立てば幸いです。


1
ExecStopをどのように考慮しますか?
バラジボッガラムラマナラヤン

systemdサービスを停止すると、CTRL + C / SIGINTがJavaプロセスに送信されます。アプリが応答すると、TimeoutStopSec(デフォルト:DefaultTimeoutStopSec 90s)の後にsigkillが送信されます
Radu Toader

4

systemdJavaアプリケーション用のサービスを作成する方法を詳しく説明したstackoverflowに関する私の答えをご覧ください。

/programming//a/22121547/272180


1
書いたものを記入してくれてありがとう、Yglodt。私はこれを1年前に整理しましたが、もしあなたの文章が他の誰かを助けるなら、それはすべて良いことです。
wax_lyrical

1

これは、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

同じ問題が発生しました(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.