systemdでJavaデーモンを設定する

systemdでJavaデーモンを設定する

私は仕事でこの定義を使用しています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

ここにいくつかの小さな変更点があります:

  1. ネットワーク ソケットをリッスンするため、 の依存関係にしますnetwork.target
  2. nohupsystemd実行可能ファイルをデーモン化してくれるので、これは必要ありません。
  3. 別個のシェル スクリプトはやり過ぎだと思うので、サービス ファイルにマージするだけです。
  4. systemdが適切な標準I/Oコンテキストを設定するので、リダイレクト(< /dev/nullなど)は必要ありません。実際、リダイレクトを取るとsystemd は、特別なログ記録メカニズムを必要とせずに、Java プログラムによって標準出力に送信されたすべての内容をジャーナルに記録します。
  5. 呼び出しシェル ( &) から非同期的に実行することは必要なく、適切でもありません。
  6. には特定の動作パターンが必要であり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

ノート:

  1. java実行するプログラムの名前として をそのまま使用することはできません。systemd はPATH実行可能ファイルを検索しません。また、 に指定する実行可能ファイルの名前はExecStart絶対である必要があります。したがって、パス検索が必要な場合は、シェルまたは 経由で呼び出す必要があります/usr/bin/env。ここでは を選択します/bin/sh
  2. これはType=simpleシェルなのでexec、子プロセスとして実行するのではなく、Java で実行する必要があります。systemd はメイン プロセスを通じてサービスを制御し、メイン プロセスは親シェル プロセスではなく、Java である必要があります。
  3. これはJava実行ファイルを直接呼び出すわけではないので、systemdはその名前をshサービス名としてジャーナルに記録します。/usr/bin/env が systemd ログで実行可能ファイルとしてマークされるのを回避する方法詳細については、こちらをご覧ください。

私の知る限り、Systemd で Java アプリケーションを実行する場合、特別な注意点はありません。

関連情報