Если вы можете уничтожить процесс, связанный с PIDFile (/run/foo.pid) при удалении /tmp/foo.path (например, оба действия как действия в скрипте отключения службы), тогда да.
Я добился этого на Tomcat, работающем над <= RHEL-7.7, с сервисом разветвления, включающим в себя действие ExecStartPost, которое записывает содержимое pidfile приложения (catalina.pid) в путь PIDFile службы. «PathExists» в соответствующем файле .path отслеживает появление в этом catalina.pid, чтобы перехватить службу systemd, когда пользователь (в моем случае непривилегированный) вызывает сценарий запуска. Когда пользователь запускает завершение работы, pid-файл приложения удаляется, PID (также непривилегированный) изящно умирает, и systemd останавливает службу как следствие pid systemd.
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 не останавливается при отключении пользователя.