web-dev-qa-db-ja.com

configure 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を使用したデーモン)を実行するためのものですか、または警告があります。これを達成する方法は?

11
lash

ここにいくつかのマイナーな変更があります:

  1. ネットワークソケットでリッスンするため、network.targetの依存関係にします。
  2. Nohupは実行可能ファイルをデーモン化するため、systemdは不要です。
  3. 別のシェルスクリプトはやり過ぎになると思うので、サービスファイルにマージするだけです。
  4. Systemdが適切な標準I/Oコンテキストを設定するため、リダイレクト(< /dev/nullなど)は必要ありません。実際、リダイレクトoutを実行すると、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であるため、シェルは子プロセスとして実行するのではなく、Javaをexecする必要があります。 systemdはメインプロセスを介してサービスを制御します。これは、親Shellプロセスではなく、Javaである必要があります。
  3. これはJava実行可能ファイルを直接実行していないため、systemdはサービス名としてshという名前をジャーナルに入れます。 / usr /を回避する方法)を参照してください。 bin/envはsystemdログで実行可能ファイルとしてマークされています これについての詳細。

私の知る限り、SystemdでJavaアプリケーションを実行することについての特別な警告はありません。

14
Yun-Chih Chen