Wie kann ich feststellen, ob ein Prozess ausgeführt wird oder nicht, und dann ein Bash-Skript veranlassen, einige Dinge basierend auf dieser Bedingung auszuführen?
Zum Beispiel:
Wenn der Prozess ausgeführt
abc
wird, führen Sie dies ausWenn es nicht läuft, mach das.
zombie
process" (nicht das, was ich als "running" -Prozess bezeichnen würde) gebracht. Eine vollständige Liste dessen, was dieSTAT
Spaltenwerte in der Ausgabe vonps
anzeigen, ist hier für diejenigen, die geneigt sind, eine Antwort zu schreiben, die dies berücksichtigt, oder ihre eigenen zu bearbeiten.Antworten:
Ein Bash-Skript für so etwas würde ungefähr so aussehen:
Dieses Skript überprüft nur, ob das Programm "gedit" ausgeführt wird.
Oder Sie können nur überprüfen, ob das Programm nicht so läuft:
quelle
/dev/null
: „/ dev / null leitet den Befehl an die Null - Gerät Standardausgabe, die eine spezielle Vorrichtung, die die Informationen geschrieben verwirft“ ... mit0
der Befehlsausgabe in eine Datei namens würde umleiten0
. In diesem Fall würde ich empfehlen, dass Sie sich damit besser auskennen> /dev/null
- Sie werden es überall sehen, da es der Standard / die richtige Art ist, Ausgaben zu verwerfen.-x
Parameter hinzu,pgrep
damit er nach der genauen Anwendung sucht. Andernfalls wird er falsch korrekt, wenn er dieselbe Zeichenfolge im Namen einer anderen Anwendung findet. Ich habe nur 1 Stunde gebraucht, um das herauszufinden.! pgrep
Jede Lösung, die so etwas verwendet
ps aux | grep abc
oderpgrep 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 übereinstimmen
abc
. Jeder Benutzer kann auf einfache Weise eine ausführbare Datei mit dem Namen erstellen und ausführenabc
(oder dieabc
irgendwo im Namen oder in den Argumenten enthalten ist), was zu einem Fehlalarm für Ihren Test führt. Es gibt verschiedene Optionen , die Sie anwenden könnenps
,grep
und umpgrep
die Suche zu starten, aber Sie werden immer noch keinen zuverlässigen Test bekommen.Wie teste ich zuverlässig auf einen bestimmten laufenden Prozess?
Das hängt davon ab, wofür Sie den Test benötigen.
Ich möchte sicherstellen, dass der Dienst abc ausgeführt wird, und falls nicht, starten Sie ihn
Dafür sind init und upstart da. Sie werden den Dienst starten und sicherstellen, dass seine PID in einer PID-Datei gespeichert wird. Wenn Sie versuchen, den Dienst erneut zu starten (über init oder upstart), wird die PID-Datei überprüft und entweder gestartet, wenn sie nicht vorhanden ist, oder abgebrochen, wenn sie bereits ausgeführt wird. Dies ist immer noch nicht 100% zuverlässig, aber es ist so nah wie möglich.
Weitere Lösungen finden Sie unter Wie kann ich überprüfen, ob mein Spielserver noch ausgeführt wird ?.
ABC ist mein Skript. Ich muss sicherstellen, dass nur eine Instanz meines Skripts ausgeführt wird.
Verwenden Sie in diesem Fall eine Sperrdatei oder ein Sperrverzeichnis. Z.B
Weitere Informationen zum Sperren finden Sie in den Bash-FAQ 45 .
quelle
pgrep
oderps
völlig ausreichend und Ihr Ansatz scheint übertrieben. Wenn Sie jedoch ein Skript für die öffentliche Verbreitung schreiben, sollten Sie es so sicher wie möglich schreiben.rm
Befehl ausgeführt. So lange es endet, nachdem die Falle gesetzt wurde, sollte das Schloss verschwunden sein.Das benutze ich:
Im Klartext: Wenn 'pgrep' 0 zurückgibt, wird der Prozess ausgeführt, andernfalls nicht.
Verwandte Lesung:
Bash Scripting :: String-Vergleiche
Ubuntu Manuals pgrep
quelle
pgrep
hat die gleiche 15 Zeichen Grenze "Feature" zuvor erwähnt, so würde zum Beispielpgrep gnome-power-manager
auch fehlschlagen-x
Option pgrep verwenden : "Nur Prozesse abgleichen, deren Name (oder Befehlszeile, wenn -f angegeben ist) genau mit dem Muster übereinstimmt."Normalerweise habe ich eine
pidof -x $(basename $0)
in meinen Skripten, um zu überprüfen, ob sie bereits ausgeführt werden.quelle
Riffing auf @ Rommel-Cids Idee, können Sie
pidof
mit dem || (||), um einen Befehl auszuführen, wenn der Prozess nicht vorhanden ist, und &&, um etwas auszuführen, wenn der Prozess vorhanden ist, wodurch eine schnelle if / then / else-Bedingung erstellt wird. Hier ist zum Beispiel einer mit einem laufenden Prozess (mein Chrome-Browser, dessen Prozessname "chrome" ist) und einem Test für einen Prozess, der nicht existiert. Ich habe die Standardausgabe mit 1> / dev / null unterdrückt, damit sie nicht gedruckt wird:quelle
Keine der "einfachen" Lösungen hat bei mir funktioniert, da die zu überprüfende Binärdatei nicht systemweit installiert ist. Daher muss ich den Pfad überprüfen, was wiederum die Verwendung des
ps -ef | grep
Ansatzes erfordert :quelle
Das erste, was mir bei Ihrem Problem in den Sinn gekommen ist:
ps aux | grep -i abc
Zeigt die Details des Prozesses an, wenn er ausgeführt wird. Sie können die Anzahl der Zeilen oder die Zeit, für die sie ausgeführt werden, mit Null oder einer anderen Manipulation vergleichen. Wenn Sie den obigen Befehl ausführen, wird Ihnen mindestens eine Ausgabezeile angezeigt, dh Details über den durch diesen Befehl erstellten Prozess. Also kümmern Sie sich darum.Das sollte ein einfacher Hack sein. Schreiben Sie es in das Bash-Skript und prüfen Sie, ob es hilfreich ist.
quelle
Verwenden von
start-stop-daemon
:Es funktioniert als normaler Benutzer.
quelle
Ich habe festgestellt, dass die akzeptierte Antwort von @John Vrbanac bei mir nicht funktioniert und dass die Antwort von @geirha die ursprüngliche Frage nicht beantwortet.
John Vrbanacs Lösung hat nicht funktioniert, um zu überprüfen, ob ein PHP-Prozess ausgeführt wurde oder nicht. Ich verwende CentOS 7.
Die Antwort von @geirha stellt nur sicher, dass eine Instanz nicht bereits ausgeführt wird, bevor eine andere gestartet wird. Dies war nicht die ursprüngliche Frage, sondern die Frage, ob ein Prozess ausgeführt wird oder nicht.
Folgendes hat bei mir funktioniert:
Angenommen, mein Prozess hatte die Zeichenfolge "Jane" im Prozessnamen. Dies wird feststellen, ob es läuft oder nicht. Dies funktioniert für BASH- und PHP-Skripte.
quelle
Hinweis :
pgrep -x lxpanel
oderpidof lxpanel
meldet weiterhin, dasslxpanel
das Programm ausgeführt wird, auch wenn es nicht mehr funktioniert (Zombie); Um den Prozess zum Leben zu erwecken, müssen wirps
und verwendengrep
quelle
Ab dem 23. September 2016 scheint pgrep die Option "-x" zu benötigen, damit das Skript von muru funktioniert.
Ich habe das obige Skript auf einem Ubuntu 16.04.1-Rechner ausprobiert und getestet. Genießen!
quelle
quelle
isProcessRunning () {if [$ (pidof $ 1)> / dev / null]; dann retval = 'true'; sonst retval = 'false'; fi; echo $ retval; }
isProcessRunning geany
wahr
quelle