Javaプロセスが終了しましたが、新しいPIDで再起動されたことをsystemdに通知する方法は?

Javaプロセスが終了しましたが、新しいPIDで再起動されたことをsystemdに通知する方法は?

Javaアプリケーションのシステムサービスを設定しました。 Javaアプリケーションが再起動されるまで、すべてがうまく機能します。再起動すると、systemd が観察するデフォルトの Java プロセスは状態 0 で終了し、それ自体で新しいインスタンスを起動します。 Systemdはプロセスが終了したと見なします。

再起動されたJavaアプリケーションで起動されたプロセスの新しいPIDをsystemdにどのように知ることができますか?

新しく起動したプロセスのPIDをどのように取得できますか?

systemd サービスは次のように定義されます。

[Unit]
Description=MyJavaApp
After=network.target

[Service]
Type=simple
User=myuser
ExecStart=/usr/bin/java -jar -Djava.awt.headless=true /opt/MyJavaApp/MyJavaApp.jar &
ExecStop=/usr/bin/java -jar -Djava.awt.headless=true /opt/MyJavaApp/MyJavaApp.jar -quit

[Install]
WantedBy=multi-user.target

答え1

残念ながら、あなたはできません。 systemdはtype=simple実行プロセスの引数を直接追跡しますExecStart。同様の問題がまだ存在しますが、type=forkingsystemdはプロセスを追跡し、一度終了すると、systemdはプロセスが死んだと見なします。

これの難しさは、systemdがこれがアプリケーションの正常な動作であるかどうかを知ることができないことです。アプリケーションには、子ワーカープロセスを作成する基本プロセスがあります。だからsystemdは、あなたの所有者が死んで、きれいにする必要があるいくつかの子供たちが残ったと思います。

この問題を解決する方法は2つあります。

  1. どういうわけかアプリケーションを起動するsystemdによって実行される監視プロセスを作成します。その後、どういうわけかこのモニタリングプロセスは、アプリケーションのシャットダウンとフォークのシャットダウンの違いを知ることができます。子プロセスの子プロセスを追跡することは容易ではないので、実装するのは非常に難しいかもしれません。
    1つの可能なアプローチは、匿名パイプを作成し、パイプの書き込み端をプロセスに渡し、読み取り端でEOFを待つことです。アプリケーションが未知のファイル記述子を閉じない限り、機能します。
  2. 代わりに+を使用するようにアプリケーションを変更してくださいexec。このようにして、新しいプロセスは前のプロセスと同じPIDを使用します。forkexec

関連情報