Jika Anda dapat mematikan proses yang terikat ke PIDFile (/run/foo.pid) ketika /tmp/foo.path dihapus (misalnya, keduanya sebagai tindakan di dalam skrip shutdown layanan), maka ya.
Saya mencapainya pada Tomcat yang menjalankan <= RHEL-7.7 dengan layanan forking termasuk tindakan ExecStartPost yang mencatat konten aplikasi pidfile (catalina.pid) ke dalam jalur layanan PIDFile. "PathExists" dalam file .path yang sesuai melacak kemunculan pada catalina.pid ini untuk mengaitkan layanan systemd ketika pengguna (dalam kasus saya, yang tidak terjangkau) meminta skrip startup. Ketika pengguna meluncurkan shutdown, aplikasi pidfile dihapus, PID (juga unprivileged) mati dengan anggun, dan systemd menghentikan layanan sebagai systemd pid mengawasi konsekuensi.
layanan poc:
[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
# . . .
Cara ini juga membantu saya untuk aplikasi Spring Boot. Tetapi ketika mereka lahir tergantung pada proses bash, saya harus segera membunuh proses induk untuk memaksa PID 1 menjadi orangtua aplikasi. Jika tidak, journalctl menampilkan pesan "* .service: Proses pengawasan XXXXX yang bukan anak kami. Kami kemungkinan besar tidak akan melihat ketika keluar.", Dan pada akhirnya layanan systemd tidak berhenti pada tindakan mematikan pengguna.