Wie überprüfe ich, ob bei einem laufenden Prozess ein Statusbit vorhanden ist?

Wie überprüfe ich, ob bei einem laufenden Prozess ein Statusbit vorhanden ist?

OK, hier ist mein Dilemma: Ich verwende den Headless-Ubuntu-Server 18.04.3 LTS auf einem Dell PowerEdge T710-Server und schreibe ein Bash-Skript, damit ich die Apache PHP Mod-Versionen einfach ändern kann, ohne Folgendes manuell verwenden zu müssen:

a2dismod php<version>
a2enmod php<version>
systemctl restart apache2

Zu Beginn des Skripts wird eine „if“-Bedingung verwendet, um zu prüfen, ob der Benutzer mit einem Benutzerkonto oder einem Root-Konto angemeldet ist. Dies geschieht über das Statusbit der UID, d. h.:

if ((UID)); then
something here
elif ((!UID)); then
something here
fi

Verwenden von ((UID)), um zu prüfen, ob das Bit wahr ist, und Verwenden von ((!UID), um zu prüfen, ob das Bit falsch ist. Aber hier liegt das Problem: Ich möchte noch etwas mehr Prüfung hinzufügen, um sicherzustellen, dass Apache tatsächlich ausgeführt wird. Ich würde lieber den Booleschen Wert „true“ oder „false“ verwenden, als etwas wie: -

systemctl status apache2

das gibt eine Menge Ausgabe. Gibt es ein Statusbit für Apache? Dann kann ich eine Prüfung durchführen, um sicherzustellen, dass Apache tatsächlich ausgeführt wird, bevor ich mit der Änderung der phpmod-Version fortfahre.

Dies ist das Skript, das ich bisher habe:https://pastebin.com/HyCjbn59

Die IT muss nicht nur prüfen, ob Apache ausgeführt wird, sondern auch, ob die verschiedenen Apache-PHP-Module tatsächlich installiert sind, bevor versucht wird, das richtige Modul zu aktivieren. Ist dies nicht der Fall, wird das Skript ausgeführt: -

apt install libapache2-mod-php<version>

Antwort1

Sie können den is-activeUnit-Befehl verwenden systemctl, der „einen Exit-Code 0 zurückgibt, wenn mindestens eine [Unit] aktiv ist, andernfalls einen Wert ungleich 0“:

if systemctl is-active --quiet apache2; then
  echo running
else
  echo not running
fi

Wenn Sie lieber einen Parameter verwenden möchten, der $?den Exit-Code des letzten Befehls enthält, können Sie einfach testen, ob er lautet 0:

systemctl is-active --quiet apache2
if [ $? -eq 0 ]; then
  echo running
else
  echo not running
fi

Weiterführende Literatur

Antwort2

Das Definieren eigener Exit-Codes verwendet weiterhin dieselbe Logik, wie @Dessert in seiner Antwort beschreibt.

#!/bin/bash

systemctl is-active -q apache2 && status=TRUE || status=FALSE

case $status in
  TRUE)
    echo do something ;;
  FALSE)
    echo do sothing else ;;
esac

verwandte Informationen