Ma configuration jusqu'à présent est:
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
Cela fonctionne très bien au démarrage mais foo.service ne sera pas tué lorsque /tmp/foo.path sera supprimé. Existe-t-il un moyen de faire en sorte que systemd le fasse ou n'est-ce tout simplement pas l'outil approprié pour le travail?
Réponses:
J'essaierais ça. Créez un service supplémentaire à l'aide de PathChanged:
foo-stop.path
Créez ensuite: foo-stop.service
Faites vérifier le script "ExecStart" pour voir s'il a
/tmp/foo.path
été supprimé (puisque PathChanged peut également se déclencher sur d'autres modifications). Si le chemin a été supprimé, appelez le script/bin/systemctl stop foo
.la source
Si vous pouvez tuer le processus lié au fichier PID (/run/foo.pid) lorsque /tmp/foo.path est supprimé (par exemple, les deux en tant qu'actions dans le script d'arrêt du service), alors oui.
Je l'ai réalisé sur un Tomcat fonctionnant sur <= RHEL-7.7 avec un service de forking incluant une action ExecStartPost qui note le contenu du fichier pid de l'application (catalina.pid) dans le chemin PIDFile du service. Un "PathExists" dans le fichier .path correspondant traque l'apparition sur ce catalina.pid afin de connecter le service systemd lorsque l'utilisateur (dans mon cas, non privilégié) appelle le script de démarrage. Lorsque l'utilisateur lance l'arrêt, le fichier pid de l'application est supprimé, le PID (également non privilégié) meurt gracieusement et systemd arrête le service en tant que conséquence de supervision du pid systemd.
poc.service:
poc.path:
Cette façon m'a également servi pour les applications Spring Boot. Mais comme ils sont nés suspendus à un processus bash, j'ai dû tuer immédiatement ce processus parent afin de forcer PID 1 à être le parent de l'application. Sinon, journalctl affiche un message "* .service: Superviser le processus XXXXX qui n'est pas notre enfant. Nous ne remarquerons probablement pas quand il se termine.", Et à la fin le service systemd ne s'arrête pas à l'action d'arrêt de l'utilisateur.
la source