Wie kann ich feststellen, ob ein Prozess ausgeführt wird oder nicht und dann ein Bash-Skript basierend auf dieser Bedingung einige Dinge ausführen lassen?
Zum Beispiel:
Wenn der Prozess
abc
läuft, tun Sie dieswenn es nicht läuft, tun Sie das.
Antwort1
Ein Bash-Skript, das so etwas tut, würde ungefähr so aussehen:
#!/bin/bash
# Check if gedit is running
# -x flag only match processes whose name (or command line if -f is
# specified) exactly match the pattern.
if pgrep -x "gedit" > /dev/null
then
echo "Running"
else
echo "Stopped"
fi
Dieses Skript prüft lediglich, ob das Programm „gedit“ läuft.
Oder Sie prüfen einfach, ob das Programm nicht läuft, und zwar folgendermaßen:
if ! pgrep -x "gedit" > /dev/null
then
echo "Stopped"
fi
Antwort2
Jede Lösung, die etwas Ähnliches verwendet ps aux | grep abc
oder pgrep abc
fehlerhaft ist.
Warum?
Da Sie nicht prüfen, ob ein bestimmter Prozess ausgeführt wird, prüfen Sie, ob Prozesse ausgeführt werden, die zufällig mit übereinstimmen abc
. Jeder Benutzer kann problemlos eine ausführbare Datei mit dem Namen erstellen und ausführen abc
(oder die abc
irgendwo in ihrem Namen oder ihren Argumenten enthält), was zu einem falschen Positiv für Ihren Test führt. Sie können verschiedene Optionen anwenden ps
, grep
um pgrep
die Suche einzugrenzen, aber Sie erhalten trotzdem kein zuverlässiges Ergebnis.
Wie teste ich also zuverlässig, ob ein bestimmter laufender Prozess vorliegt?
Das hängt davon ab, wofür Sie den Test benötigen.
Ich möchte sicherstellen, dass der ServiceABCläuft, und wenn nicht, starten Sie es
Dafür ist systemd da. Es kann den Dienst automatisch starten und überwachen und kann reagieren, wenn er beendet wird.
SehenWie kann ich überprüfen, ob mein Spieleserver noch läuft?für andere Lösungen.
ABCist mein Skript. Ich muss sicherstellen, dass nur eine Instanz meines Skripts ausgeführt wird.
Verwenden Sie in diesem Fall eine Sperrdatei oder ein Sperrverzeichnis. Beispiel:
#!/usr/bin/env bash
if ! mkdir /tmp/abc.lock; then
printf "Failed to acquire lock.\n" >&2
exit 1
fi
trap 'rm -rf /tmp/abc.lock' EXIT # remove the lockdir on exit
# rest of script ...
SehenBash-FAQ 45für andere Verschlussarten.
Antwort3
Das ist, was ich verwende:
#!/bin/bash
#check if abc is running
if pgrep abc >/dev/null 2>&1
then
# abc is running
else
# abc is not running
fi
In reinem Englisch:Wenn „pgrep“ 0 zurückgibt, läuft der Prozess, andernfalls nicht.
Weiterführende Literatur:
Bash-Skripting ::Zeichenfolgenvergleiche
Ubuntu-Handbücherpgrep
Antwort4
Um die Idee von @rommel-cid aufzugreifen, können Sie pidof
|| (||) verwenden, um einen Befehl auszuführen, wenn der Prozess nicht existiert, und &&, um etwas auszuführen, wenn der Prozess existiert. So erstellen Sie schnell eine if/then/else-Bedingung. Hier ist beispielsweise eine mit einem laufenden Prozess (mein Chrome-Browser, dessen Prozessname „Chrome“ ist) und eine, die auf einen nicht existierenden Prozess prüft. Ich habe die Standardausgabe mit 1>/dev/null unterdrückt, damit sie nicht gedruckt wird:
$ (pidof chrome 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run instea\
d"
its running? ok, so am i then
$ (pidof nosuchprocess 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run\
instead"
it's not running? ok i'll run instead
$