La façon "correcte" de tester si un service s'exécute dans un script

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 l'état $ service [service_name] status .

Mais (surtout depuis le passage à systemd) qui imprime tout un tas de text qui est un peu désordonné à parsingr. J'ai supposé qu'il y a une command faite pour les scripts avec une sortie simple ou une valeur de return que je peux vérifier.

Mais Googling autour ne donne que des tonnes de résultats "Oh, juste ps aux | grep -v grep | grep [service_name] ". Cela ne peut pas être la meilleure pratique, n'est-ce pas? Que se passe-t-il si une autre instance de cette command est en cours d'exécution, mais pas celle lancée par le script d'initialisation SysV?

Ou devrais-je juste me taire et me salir les mains avec un peu de pègre?

systemctl a une sous is-active command is-active pour cela:

 systemctl is-active --quiet service 

sortira avec le statut zéro si le service est actif, non nul 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 indiqué par don_crissti , certaines unités peuvent être actives même si rien n'est en cours 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.

systemctl a un mode approprié pour le script; utilisez show plutôt que status et ajoutez les options -p / --properties et --value pour get uniquement la sortie que vous voulez.

Voici un exemple (à partir d'un système Ubuntu 17.04):

 $ systemctl show -p SubState --value NetworkManager running 

Exécution (ou autre) est un sous- SubState . Si vous voulez savoir si un service est actif, utilisez la propriété ActiveState

 $ systemctl show -p ActiveState --value x11-common inactive $ systemctl show -p SubState --value x11-common dead 

Notes de l' man :

 show [PATTERN...|JOB...] Show properties of one or more units, jobs, or the manager itself. If no argument is specified, properties of the manager will be shown. If a unit name is specified, properties of the unit are shown, and if a job ID is specified, properties of the job are shown. By default, empty properties are suppressed. Use --all to show those too. To select specific properties to show, use --property=. This command is intended to be used whenever computer-parsable output is required. Use status if you are looking for formatted human-readable output. -p, --property= When showing unit/job/manager properties with the show command, limit display to properties specified in the argument. The argument should be a comma-separated list of property names, such as "MainPID". Unless specified, all known properties are shown. If specified more than once, all properties with the specified names are shown. Shell completion is implemented for property names. --value When printing properties with show, only print the value, and skip the property name and "=".