Im Allgemeinen ist es eine schlechte Idee , den einfachen Ansatz mit , um zu versuchen psund grepzu 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 -qFlag, das demselben Flag entspricht, für grepdas keine Umleitung mehr erforderlich ist /dev/null. Es gibt auch ein -fFlag, 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 pgrepSie auch Zugriff, mit pkilldem 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 varnishwird 0 zurückgeben, wenn es ausgeführt wird, andernfalls 3), unter OpenBSD rcctlusw.
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 -qFlag 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 grepProzess grepdurch 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 varnishist (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 varnishführt dazu, dass die Shell durch [v]arnishden Dateinamen ersetzt wird varnishund Sie einen Treffer auf das Muster in der Prozesstabelle (dem grepProzess) erhalten.