Wenn Sie den an die PID-Datei (/run/foo.pid) gebundenen Prozess beenden können, wenn /tmp/foo.path entfernt wird (z. B. beide als Aktionen im Skript zum Herunterfahren des Dienstes), dann ja.
Ich habe es auf einem Tomcat erreicht, der über <= RHEL-7.7 ausgeführt wird, mit einem Forking-Service, der eine ExecStartPost-Aktion enthält, die den Inhalt der Anwendungs-PID-Datei (Catalina.PID) im PIDFile-Pfad des Dienstes notiert. Ein "PathExists" in der entsprechenden .path-Datei verfolgt das Erscheinen in dieser Catalina.pid, um den systemd-Dienst zu verknüpfen, wenn der Benutzer (in meinem Fall nicht privilegiert) das Startskript aufruft. Wenn der Benutzer das Herunterfahren startet, wird die Anwendungs-PID-Datei entfernt, die PID (ebenfalls nicht privilegiert) stirbt ordnungsgemäß und systemd stoppt den Dienst als Folge der Überwachung der 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
# . . .
Dieser Weg diente mir auch für Spring Boot-Anwendungen. Aber als sie geboren wurden, die an einem Bash-Prozess hängen, musste ich diesen übergeordneten Prozess sofort beenden, um PID 1 als übergeordneten Anwendungsbereich zu erzwingen. Wenn nicht, zeigt journalctl die Meldung "* .service: Überwachungsprozess XXXXX, der nicht unser Kind ist. Wir werden es höchstwahrscheinlich nicht bemerken, wenn er beendet wird.", Und am Ende stoppt der systemd-Dienst nicht beim Herunterfahren des Benutzers.