Mon problème :
J'écris un script bash et j'aimerais vérifier si un service donné est en cours d'exécution.
Je sais comment faire cela manuellement, avec le statut $ service [service_name] status
.
Mais (surtout depuis le passage à systemd) cela imprime tout un tas de texte un peu compliqué à analyser. J'ai supposé qu'il existe une commande conçue pour les scripts avec une sortie simple ou une valeur de retour que je peux vérifier.
Mais googler ne donne qu'une tonne de "Oh, juste ps aux | grep -v grep | grep [service_name]
" résultats. Cela ne peut pas être la meilleure pratique, n'est-ce pas? Que se passe-t-il si une autre instance de cette commande est en cours d'exécution, mais qu'aucune n'a été lancée par le script d'initialisation SysV ?
Ou devrais-je simplement me taire et me salir les mains avec un peu de pgrep ?
Réponse acceptée :
systemctl
a un is-active
sous-commande pour ceci :
systemctl is-active --quiet service
sortira avec le statut zéro si service
est actif, différent de zéro sinon, ce qui le rend idéal pour les scripts :
systemctl is-active --quiet service && echo Service is running
Si vous omettez --quiet
il affichera également l'état actuel sur sa sortie standard.
Comme l'a souligné don_crissti, certaines unités peuvent être actives même si rien ne fonctionne pour fournir le service :les unités marquées comme "RemainAfterExit" sont considérées comme actives si elles se terminent avec succès, l'idée étant qu'elles fournissent un service qui n'a pas besoin d'un démon (par exemple ils configurent certains aspects du système). Les unités impliquant des démons ne seront cependant actives que si le démon est toujours en cours d'exécution.