/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サービスはユーザーのシャットダウンアクションで停止しません。