systemdでJavaデーモンを構成する


11

私はこの定義を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、それとも警告、つまりこれを達成するためのより安定した安全な方法ですか?

回答:


14

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

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

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


1
それはうまくいきません。問題1:これはシェルではありません。リダイレクト演算子はありません。とにかく、そのリダイレクトを本当に望まない。問題2:ExecStartは絶対パス名を要求します。問題3:unix.stackexchange.com/questions/229523
JdeBP

頭を上げた。私は問題1を修正することしかできません。問題2、3をどのように修正しますか?
Yun-Chih Chen

1
編集された回答を参照してください。
JdeBP 2016年

ここではshは必要ないと思います。
faho 2016年

@ Yun-ChihChen様こんにちは。ExecStropはどのようになりますか?私はpidファイルと共にinit.dを使用してきましたが、これがより簡単であることがわかりました。だから私は私が停止する方法などを知っていることを確認する必要がありました。ありがとう
黒の先生
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.