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 (besonders seit dem Wechsel zu systemd) druckt das eine ganze Menge Text, der ein wenig unordentlich zu analysieren ist. Ich bin davon ausgegangen, dass es einen Befehl für Skripte mit einfacher Ausgabe oder einem Rückgabewert gibt, den ich überprüfen kann.
Aber Googeln liefert nur eine Menge „Oh, nur ps aux | grep -v grep | grep [service_name]
" Ergebnisse. Das kann nicht die beste Praxis sein, oder? Was ist, wenn eine andere Instanz dieses Befehls ausgeführt wird, aber keine vom SysV-Init-Skript gestartet wurde?
Oder soll ich einfach die Klappe halten und mir mit ein bisschen Pgrep die Hände schmutzig machen?
Akzeptierte Antwort:
systemctl
hat einen is-active
Unterbefehl dafür:
systemctl is-active --quiet service
wird mit Status Null beendet, wenn service
ist aktiv, ansonsten ungleich Null, was es ideal für Skripte macht:
systemctl is-active --quiet service && echo Service is running
Wenn Sie --quiet
weglassen es wird auch den aktuellen Status auf seiner Standardausgabe ausgeben.
Wie von don_crissti betont, können einige Units aktiv sein, obwohl nichts läuft, um den Dienst bereitzustellen:Units, die als „RemainAfterExit“ gekennzeichnet sind, gelten als aktiv, wenn sie erfolgreich beendet werden, da sie einen Dienst bereitstellen, der keinen Daemon benötigt (z. B. sie konfigurieren einen Aspekt des Systems). Einheiten mit Daemons sind jedoch nur aktiv, wenn der Daemon noch läuft.