
私は仕事でこの定義を使用していますsystemd
:
[Unit]
Description=Some job
[Service]
ExecStart=/usr/local/sbin/somejob
User=dlt
Type=forking
[Install]
WantedBy=multi-user.target
スクリプトは次のように呼び出されます (tcpip ソケットをリッスンし、入力をファイルに追加する単純なルーチンを呼び出します)。
#!/bin/sh
cd /home/user/tmp/testout
nohup java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar </dev/null >/dev/null &
プロセスが実行中systemctl start somejob
として表示され、init
その親が次のようになります。
user@CANTANDO ~$ ps -u dlt eo pid,ppid,command
PID PPID COMMAND
8718 1 java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar
プロセスを実行すると、systemctl stop somejob
プロセスは表示されなくなります (ポートは閉じられます)。
すべてが順調に進んでいるようだ
私の質問は、これは受け入れられる解決策で Java デーモンを実行するにはsystemd
、 を使用する必要があるのでしょうか、それとも、これを実現するための他のより安定した安全な方法など、注意点があるのでしょうか?
答え1
ここにいくつかの小さな変更点があります:
- ネットワーク ソケットをリッスンするため、 の依存関係にします
network.target
。 nohup
systemd
実行可能ファイルをデーモン化してくれるので、これは必要ありません。- 別個のシェル スクリプトはやり過ぎだと思うので、サービス ファイルにマージするだけです。
- systemdが適切な標準I/Oコンテキストを設定するので、リダイレクト(
< /dev/null
など)は必要ありません。実際、リダイレクトを取ると外systemd は、特別なログ記録メカニズムを必要とせずに、Java プログラムによって標準出力に送信されたすべての内容をジャーナルに記録します。 - 呼び出しシェル (
&
) から非同期的に実行することは必要なく、適切でもありません。 - には特定の動作パターンが必要であり
Type=forking
、デーモンがそれに従わないと問題が発生します。そのため、Type=simple
(またはType=notify
) を試してください。
したがって、サービス ファイルは次のようになります。
[Unit]
Description=Some job
After=network.target
[Service]
WorkingDirectory=/home/user/tmp/testout
SyslogIdentifier=SocketTest
ExecStart=/bin/sh -c "exec java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar"
User=dlt
Type=simple
[Install]
WantedBy=multi-user.target
ノート:
java
実行するプログラムの名前として をそのまま使用することはできません。systemd はPATH
実行可能ファイルを検索しません。また、 に指定する実行可能ファイルの名前はExecStart
絶対である必要があります。したがって、パス検索が必要な場合は、シェルまたは 経由で呼び出す必要があります/usr/bin/env
。ここでは を選択します/bin/sh
。- これは
Type=simple
シェルなのでexec
、子プロセスとして実行するのではなく、Java で実行する必要があります。systemd はメイン プロセスを通じてサービスを制御し、メイン プロセスは親シェル プロセスではなく、Java である必要があります。 - これはJava実行ファイルを直接呼び出すわけではないので、systemdはその名前を
sh
サービス名としてジャーナルに記録します。/usr/bin/env が systemd ログで実行可能ファイルとしてマークされるのを回避する方法詳細については、こちらをご覧ください。
私の知る限り、Systemd で Java アプリケーションを実行する場合、特別な注意点はありません。