foo.パス

foo.パス

これまでのところ、私の設定は次のようになりました。

foo.パス

[Path] 
PathExists=/tmp/foo.path

[Install] 
WantedBy=multi.user.target

foo.service

[Unit]
Description=Matt Test
BindsTo=foo.path

[Service]
ExecStart=/bin/sh /home/mpekar/bin/foo.sh 
PIDFile=/run/foo.pid

これは起動時にうまく機能しますが、/tmp/foo.pathが削除されてもfoo.serviceは終了しません。これを行うためにシステム化する方法はありますか?それとも仕事に適したツールではありませんか?

答え1

私はこれを試してみます。 PathChangedを使用して追加のサービスを作成します。

foo-stop.path

[Path] 
PathChanged=/tmp/foo.path

[Install] 
WantedBy=multi.user.target

次に、次を作成します。foo-stop.service

「ExecStart」スクリプトが/tmp/foo.path削除されたことを確認します(PathChangedが他の変更もトリガーできるため)。パスが削除された場合は、スクリプトに呼び出しを許可します/bin/systemctl stop foo

答え2

/tmp/foo.path が削除されたときに PIDFile(/run/foo.pid) にバインドされたプロセスを終了できる場合 (例: サービス終了スクリプトの操作の両方)。

私は、アプリケーションpidfile(catalina.pid)の内容をサービスPIDFileパスに書き込むExecStartPost操作を含むフォークサービスを使用して<= RHEL-7.7を実行するTomcatでこれを実装しました。その.pathファイルの「PathExists」は、ユーザー(私の場合は許可されていません)が起動スクリプトを呼び出すときにシステムサービスを接続するためにこのcatalina.pidに表示される内容を追跡します。ユーザーがシャットダウンを開始すると、アプリケーションのpidfileが削除され、許可されていないPIDも正常に終了し、systemdはsystemd pid監督の結果としてサービスを停止します。

フィールドサービス:

[nouser@nohost system]# cat poc.service
# . . .
[Unit]
After=network.target
After=%p.path
Wants=%p.path
# . . . 
[Service]
Type=forking
Environment="%p_APPLICATION_PID_FILE=/opt/%p/logs/catalina.pid"
PIDFile=/var/run/%p.pid
ExecStart=/bin/sh -c '/path/to/tomcat/control/script/invoked/with/su/hypen start'
ExecStartPost=/bin/sh -c 'cat ${%p_APPLICATION_PID_FILE} > $(systemctl show %n -p PIDFile|cut -f2- -d"=")'
ExecStop=/bin/sh -c '/path/to/tomcat/control/script/invoked/with/su/hypen stop'
# . . .

poc.パス:

[nouser@nohost system]# cat poc.path
# . . .
[Path]
PathExists=/opt/%p/logs/catalina.pid
# . . .

このアプローチはSpring Bootアプリケーションにも当てはまります。ただし、基本的にbashプロセスにぶら下がっているため、PID 1がアプリケーションの親になるように強制するには、親プロセスをすぐに終了する必要があります。そうでない場合、Journalctlは「*.service:Supervisor process XXXXXXこれは私たちの子プロセスではありません。終了すると不明です」というメッセージを表示し、最後にユーザーがジョブを閉じてもsystemdサービスは停止しません。

関連情報