Mein Problem:
Ich schreibe ein Bash-Skript und möchte darin überprüfen, ob ein bestimmter Dienst ausgeführt wird.
Ich weiß, wie man das manuell macht, mit $ service [service_name] status
.
Aber (vor allem seit dem Umstieg auf systemd) wird eine ganze Reihe von Text gedruckt, deren Analyse etwas unübersichtlich ist. Ich nahm an, es gibt einen Befehl für Skripte mit einfacher Ausgabe oder einen Rückgabewert, den ich überprüfen kann.
Aber googeln um ergibt nur eine Tonne „Oh, nur ps aux | grep -v grep | grep [service_name]
“ Ergebnisse. Das kann doch nicht die beste Übung sein, oder? Was ist, wenn eine andere Instanz dieses Befehls ausgeführt wird, aber keine, die vom SysV-Init-Skript gestartet wurde?
Oder sollte ich einfach die Klappe halten und mir die Hände mit einem kleinen Pgrep schmutzig machen?
quelle
inactive
oderactivating
und beidesystemctl status
und beendensystemctl is-active
mit 3. (ab systemd-241 ) Workaround:systemctl show service | grep -qx ActiveStatus=activating
foo
nimmt Systemänderungen vor, bei denen ein Neustart erforderlich ist, und verwendet einen einmaligen Dienst, beispielsweisefoo_cleanup
beim nächsten Start , um die Daten zu bereinigen. Ich teste dies (mein Skript ist auch als Dienst geplant) und möchte später Fehler sammeln, aber wann ist es danach (vsauce music)? Nun, eines der Kriterien ist, dassfoo_cleanup
es zu Ende ist ("aufgehört, aktiv zu sein").systemctl
hat einen Modus, der für Scripting geeignet ist; Verwenden Sieshow
stattdessenstatus
und fügen Sie die Optionen-p
/--properties
und hinzu--value
, um nur die gewünschte Ausgabe zu erhalten.Hier ist ein Beispiel (von einem Ubuntu 17.04-System):
Laufen (oder anders) ist a
SubState
. Wenn Sie wissen möchten, ob ein Dienst aktiv ist, verwenden Sie die EigenschaftActiveState
Notizen von der
man
:quelle
--version
Option mit systemctl akzeptieren .Als Ergänzung zu Zannas Antwort wurde die
--value
Option fürsystemctl show
mit Version 230 von systemd eingeführt . Daher ist es in bestimmten Distributionen wie Debian Jessie möglicherweise nicht verfügbar.In diesem Fall kann die Option mit sed emuliert werden:
quelle
Ich finde dies nützlich für die Befehlszeilenausführung oder wenn Sie Skripte erstellen.
Kopiert von @StephenKitt
Dadurch wird überprüft, ob der Dienst inaktiv ist, und ein Neustart des Dienstes durchgeführt
die
||
es überprüft , ob der Rückgabewert von systemctl Nicht-Null Bedeutung ist , wenn es nicht aktiv ist , wie vom Autor erklärt.quelle
Für die Party bin ich zu spät, allerdings ist die Verwendung von systemctl zusammen mit aktiv
&&
und||
dies wird im Skript nicht immer der Fall sein. Das Folgende ist eines, das ich für Tomcat verwendet habe, aber es kann in einer Methode verwendet werden, die Argumente verwendet und den Dienstnamen als Argumente übergibt, wenn Sie mehrere Dienste prüfen müssen, dies hier jedoch außerhalb des Gültigkeitsbereichs liegt.Dies ist, wie ich ausgenutzt habe ... Ich teile nur meine.
und für die Einfachheit und einfache Sachen, folgen Sie anderen hier erklärt:
quelle
if systemctl is-active --quiet tomcat.service
? Ist auch[[
keine Standard-Shell.&&
und zu tun||
.Anstatt den sed-Befehl wie in der Antwort von Oxmel zu verwenden, ist es ausreichend, ihn
cut -d'=' -f 2
für alle Arten von abgefragten Eigenschaften zu verwenden:zum Beispiel:
quelle
Habe gerade dieses tolle kleine Drehbuch gefunden:
Quelle
quelle