it-swarm.com.de

Wie bewerte ich grep in bash?

Ich möchte einen bestimmten Status eines Dienstes überprüfen (Tomcat8.service).

Nur wenn der String gefunden wurde, möchte ich eine Logik ausführen.

Problem: Auch wenn ich das Skript für einen Dienstnamen ausführe, der nicht existiert ("asd" in diesem Beispiel), stimmt der if $status immer noch überein und wird ausgedruckt. Aber wieso?

status = $(systemctl status asd.service | grep 'active')
echo $status

if $status
then 
    echo "$SERVICE was active"
    exit 0
fi 
exit 0

Das Ergebnis ist: asd.service was active, was sicherlich nicht wahr ist.

Der echo $status druckt: status: Unknown job: =

2
membersound

Sie können den Rückgabestatus von grep verwenden.

systemctl status asd.service | grep 'active' \
    && status=active \
    || status=not_active

if [ "$status" == "active" ]; then
    [...]
fi

oder noch einfacher:

test $(systemctl status asd.service | grep 'active') \
    && echo "$SERVICE was active"

oder wenn Sie if bevorzugen:

if $(systemctl status asd.service | grep 'active'); then
    echo "$SERVICE was active"
fi

Achten Sie auf jeden Fall auf die Schlüsselwörter inactive, not active, active (exited) oder Ähnliches. Dies entspricht auch Ihrer grep -Anweisung. Siehe die Kommentare. Danke @ Terrance für den Hinweis.


Aktualisieren:

Grep ist nicht nötig. In systemctl ist der Befehl is-active enthalten.

systemctl -q is-active asd.service \
    && echo "$SERVICE was active"

oder:

if systemctl -q is-active asd.service; then
    echo "is active";
fi
2
pLumo

Einige Kommentare zur Codeüberprüfung:

  • sh/bash/ksh/zsh-Variablenzuweisungen sehen aus wie var=value - Leerzeichen um = sind nicht zulässig. ( Dokumentation )
  • status=$(some command) - Die Statusvariable enthält den Ausgang des Befehls, nicht den Exit-Status. Der Beendigungsstatus befindet sich in der Variablen $?
  • die if -Anweisung wirkt sich auf den Beendigungsstatus des nachfolgenden Befehls aus ( Dokumentation )

    if some_comment; then action1; else action2; fi
    

    Am häufigsten lautet der Befehl [ oder [[, um eine Bedingung zu testen.

    grep hat jedoch einen eindeutigen Beendigungsstatus: 0, wenn das Muster gefunden wurde, andernfalls 1. Also willst du das:

    if systemctl status asd.service | grep -q 'active'; then
        echo "$SERVICE was active"
    fi
    
0
glenn jackman