Im Allgemeinen ist es eine schlechte Idee , den einfachen Ansatz mit , um zu versuchen ps
und grep
zu versuchen , einen bestimmten Prozess zu bestimmen , ob ausgeführt wird .
Sie wären dafür viel besser dran pgrep
:
if pgrep "varnish" >/dev/null; then
echo "Varnish in running"
else
echo "Varnish is not running"
fi
Siehe das Handbuch für pgrep
. Auf einigen Systemen (wahrscheinlich nicht unter Linux) erhalten Sie ein -q
Flag, das demselben Flag entspricht, für grep
das keine Umleitung mehr erforderlich ist /dev/null
. Es gibt auch ein -f
Flag, das die Übereinstimmung in der vollständigen Befehlszeile und nicht nur im Prozessnamen ausführt. Man kann die Übereinstimmung auch auf Prozesse beschränken, die zu einem bestimmten Benutzer gehören -u
.
Durch die Installation erhalten pgrep
Sie auch Zugriff, mit pkill
dem Sie Prozesse anhand ihrer Namen signalisieren können.
Auch wenn dies ein Service - Daemon , und wenn Ihr Unix - System eine Möglichkeit , Abfragen für Informationen (zB ob es sich um und läuft oder nicht) hat, dann ist das die richtige Art und Weise auf sie zu prüfen.
Unter Linux haben Sie systemctl
( systemctl is-active --quiet varnish
wird 0 zurückgeben, wenn es ausgeführt wird, andernfalls 3), unter OpenBSD rcctl
usw.
Nun zu Ihrem Skript:
In Ihrem Skript analysieren Sie die Ausgabe von ps ax
. Diese Ausgabe enthält den Namen des Skripts selbst check_varnish_pro.sh
, das offensichtlich die Zeichenfolge enthält varnish
. Dies gibt Ihnen ein falsches Positiv. Sie hätten dies entdeckt, wenn Sie es beim Testen ohne -q
Flag ausgeführt hätten grep
.
#!/bin/bash
ps ax | grep '[v]arnish'
Ausführen:
$ ./check_varnish_pro.sh
31004 p1 SN+ 0:00.04 /bin/bash ./check_varnish_pro.sh
Ein weiteres Problem ist, dass Sie zwar versuchen, den grep
Prozess grep
durch die Verwendung [v]
im Muster vor dem Erkennen durch sich selbst zu "verbergen" . Dieser Ansatz schlägt fehl, wenn Sie das Skript oder die Befehlszeile in einem Verzeichnis ausführen, in dem eine Datei oder ein Verzeichnis benannt varnish
ist (in diesem Fall erhalten Sie erneut ein falsches Positiv). Dies liegt daran, dass das Muster nicht in Anführungszeichen gesetzt ist und die Shell damit das Dateinamen-Globbing ausführt.
Sehen:
bash-4.4$ set -x
bash-4.4$ ps ax | grep [v]arnish
+ ps ax
+ grep '[v]arnish'
bash-4.4$ touch varnish
+ touch varnish
bash-4.4$ ps ax | grep [v]arnish
+ ps ax
+ grep varnish
91829 p2 SN+p 0:00.02 grep varnish
Das Vorhandensein der Datei varnish
führt dazu, dass die Shell durch [v]arnish
den Dateinamen ersetzt wird varnish
und Sie einen Treffer auf das Muster in der Prozesstabelle (dem grep
Prozess) erhalten.