Mon problème:
J'écris un script bash dans lequel j'aimerais vérifier si un service donné est en cours d'exécution.
Je sais comment faire cela manuellement, avec $ service [service_name] status
.
Mais (surtout depuis le passage à systemd), qui imprime un tas de texte un peu compliqué à analyser. J'ai supposé qu'il existe une commande pour les scripts avec une sortie simple ou une valeur de retour que je peux vérifier.
Mais googler autour ne donne qu'une tonne de résultats "Oh, juste ps aux | grep -v grep | grep [service_name]
". Cela ne peut pas être la meilleure pratique, est-ce? Que se passe-t-il si une autre instance de cette commande est en cours d'exécution, mais pas une autre démarrée par le script init SysV?
Ou devrais-je simplement me taire et me salir les mains avec un petit pgrep?
la source
inactive
ouactivating
et les deuxsystemctl status
etsystemctl is-active
sortent avec 3. (à partir de systemd-241 ) Solution de contournement:systemctl show service | grep -qx ActiveStatus=activating
foo
fait quelque chose au système impliquant un redémarrage et utilise un service ponctuel, par exemple,foo_cleanup
lors du prochain démarrage pour nettoyer les choses. Je teste cela (mon script est également planifié en tant que service) et je souhaite collecter les erreurs par la suite, mais quand est-il ensuite (musique vsauce)? L’un des critères est qu’ilfoo_cleanup
est terminé ("a cessé d’être actif").systemctl
a un mode approprié pour le script; utilisezshow
plutôt questatus
, et ajoutez les options-p
/--properties
et--value
pour obtenir uniquement le résultat souhaité.Voici un exemple (d'un système Ubuntu 17.04):
Courir (ou autrement) est un
SubState
. Si vous voulez savoir si un service est actif, utilisez la propriétéActiveState
Notes de la
man
:la source
--version
option avec systemctl.En complément de la réponse de Zanna, l'
--value
option forsystemctl show
a été introduite avec la version 230 de systemd . Il est donc possible qu’il ne soit pas disponible sur certaines distributions comme Debian Jessie.Dans ce cas, on peut émuler l'option en utilisant sed:
la source
Je trouve cela utile pour l'exécution en ligne de commande ou si vous créez des scripts.
Copié de @StephenKitt
Ceci vérifiera si le service est en panne et effectuera un redémarrage du service.
the
||
there vérifie si la valeur renvoyée par systemctl est non nulle, ce qui signifie qu'elle n'est pas active comme l'explique l'auteur.la source
Je suis trop tard pour le parti, cependant utiliser systemctl est actif avec
&&
et||
dans ce script ne sera pas le cas tout le temps. Le texte ci-dessous est celui que j’ai utilisé pour tomcat, mais que je peux utiliser dans une méthode prenant des arguments et donnant le nom de service comme arguments si vous devez vérifier plusieurs services, mais dont le champ est hors de portée.C’est ainsi que j’ai utilisé .... Je partage juste le mien.
et pour la simplicité et la facilité, suivez les explications suivantes:
la source
if systemctl is-active --quiet tomcat.service
? En outre,[[
n'est pas shell standard.&&
et||
.Au lieu d'utiliser la commande sed comme dans la réponse d'Oxmel, il suffit de l'utiliser
cut -d'=' -f 2
pour tous les types de propriétés interrogées:par exemple:
la source
Je viens de trouver ce bon petit script:
La source
la source