私は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
を使用したデーモン)を実行するためのものですか、または警告があります。これを達成する方法は?
ここにいくつかのマイナーな変更があります:
network.target
の依存関係にします。Nohup
は実行可能ファイルをデーモン化するため、systemd
は不要です。< /dev/null
など)は必要ありません。実際、リダイレクトoutを実行すると、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
であるため、シェルは子プロセスとして実行するのではなく、Javaをexec
する必要があります。 systemdはメインプロセスを介してサービスを制御します。これは、親Shellプロセスではなく、Javaである必要があります。sh
という名前をジャーナルに入れます。 / usr /を回避する方法)を参照してください。 bin/envはsystemdログで実行可能ファイルとしてマークされています これについての詳細。私の知る限り、SystemdでJavaアプリケーションを実行することについての特別な警告はありません。