これまでのところ、私の設定は次のようになりました。
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サービスは停止しません。