systemdを使用して、ファイルの存在に基づいてサービスを開始および停止できますか?


9

これまでの私の設定は:

foo.path

[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は強制終了されません。systemdにこれを実行させる方法はありますか、それともそのジョブに適したツールではありませんか?


回答:


4

私はこれを試します。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


1
systemdが同じことを行うための明示的なオプションを提供するような時まで、私は先に進んでこれを受け入れます。
2016年

0

/tmp/foo.pathが削除されたときに(たとえば、両方がサービスシャットダウンスクリプト内のアクションとして)、PIDFile(/run/foo.pid)にバインドされたプロセスを強制終了できる場合は、はい。

アプリケーションpidfile(catalina.pid)の内容をサービスのPIDFileパスに書き留めるExecStartPostアクションを含むforkingサービスを使用して、RHEL-7.7以上で実行されているTomcatでそれを実現しました。対応する.pathファイルの「PathExists」は、ユーザー(私の場合は非特権)が起動スクリプトを呼び出したときにsystemdサービスをフックするために、このcatalina.pidに表示される内容を追跡します。ユーザーがシャットダウンを開始すると、アプリケーションpidfileが削除され、PID(これも非特権)が正常に停止し、systemdがsystemd pid監視の結果としてサービスを停止します。

poc.service:

[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.path:

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

この方法は、Spring Bootアプリケーションにも役立ちました。しかし、bashプロセスにぶら下がって生まれたので、PID 1をアプリケーションの親にするために、その親プロセスをすぐに強制終了する必要がありました。そうでない場合、journalctlはメッセージ「* .service:監督されていないプロセスXXXXXです。これは子プロセスではありません。終了するときに気付かない可能性があります。」が表示され、最後にsystemdサービスはユーザーのシャットダウンアクションで停止しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.