So überprüfen Sie, ob der Prozess bereits ausgeführt wird oder nicht

32

Ich möchte überprüfen, ob der jeweilige Prozess bereits ausgeführt wird oder nicht.

Ich habe diese Fragen und Antworten referiert .

Aber ich habe keine konkrete Lösung bekommen. Folgendes Beispiel habe ich ausprobiert: Ich habe eine abc.shDatei erstellt und dieses Skript im Hintergrund ausgeführt, wie z sh abc.sh &.

Jetzt läuft diese Datei im Hintergrund und ich feuere den ps aux | grep "abc"Befehl.

Das Folgende ist die Ausgabe dieses Befehls:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

Danach stoppe ich das abc.shlaufende Skript und führe den gleichen ps aux | grep "abc"Befehl aus.

Aber ich erhalte die gleiche Ausgabe wie:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

Gibt es eine andere Möglichkeit, festzustellen, ob der Prozess ausgeführt wird oder nicht?

Prakash V Holkar
quelle

Antworten:

41

Jeder Prozess wird in der Ausgabe von aufgelistet ps aux; ob rennen, schlafen, zombie oder stehen bleiben.

Da Sie den Prozess jedoch mit ausgeführt haben sh abc.sh, shwird in Ihrem Fall die Anwendung (Shell) ausgeführt und nicht abc.sh. Daher ps auxwird der Prozess nicht enthalten, abc.shaufgrund dessen grepkein Ergebnis erzielt werden konnte.

Die richtige Art und Weise, wie Sie es hätten verwenden sollen, ist wie folgt:

ps aux | grep sh

Dies gibt möglicherweise auch einen anderen Prozess zurück, bei dem die Zeichenfolge an einer shbeliebigen Stelle in der Ausgabe von ausgeführt wird ps aux.

Sie sollten beachten , dass der Prozess „läuft“ wird, wenn der Ausgang von ps auxseinem hat STATwie R. Wenn es sich um etwas anderes handelt, wird es nicht in der Instanz ausgeführt, in der Sie den Befehl zum Überprüfen der ausgeführten Prozesse ausgelöst haben. Die verschiedenen Prozesszustände finden Sie in der Manpage für ps:

D    uninterruptible sleep (usually IO)
R    running or runnable (on run queue)
S    interruptible sleep (waiting for an event to complete)
T    stopped, either by a job control signal or because it is being traced
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    defunct ("zombie") process, terminated but not reaped by its parent

Sie können auch den topBefehl ausführen, um zu überprüfen, ob der Prozess ausgeführt wird oder sich im Ruhezustand befindet und wie viel CPU und RAM er verbraucht. (Dies listet Ihren Prozess erneut auf als sh).

Wenn Sie jedoch möchten, dass Ihr Prozess als aufgeführt wird abc.sh, sollten Sie die erste Zeile des Skripts haben, als das Sie ausgeführt werden:

#!/bin/sh

Damit die Shell weiß, welche Anwendung zum Ausführen des Skripts verwendet werden soll (in diesem Fall sh, ändern Sie es in #!/bin/bashfür Bash) und stellen Sie dann dem Prozess ausführbare Berechtigungen zur Verfügung, indem Sie Folgendes verwenden:

chmod +x /path/to/abc.sh

Ersetzen /path/to/mit dem Speicherort der abc.shDatei und führen Sie dann abc.shmit

/path/to/abc.sh

erneut durch /path/to/den Speicherort der abc.shDatei ersetzen .

Job in
quelle
2
Eine kurze Frage. Was ist stat S+bedeutet
Prakash V Holkar
Sie können jedoch den Unterschied zwischen laufenden Prozessen und nicht laufenden Prozessen durch die Ausgabe des ps aux | grep filenameBefehls feststellen .
Avinash Raj
@ TechGuru: Es bedeutet, dass der Prozess im Vordergrund schläft. Weitere Informationen finden Sie auf der Manualpage von ps.
jobin
@AvinashRaj: Ja, natürlich kannst du.
jobin
Ich erhalte einen Fehler: Fehler, mache das: mount -t proc proc / proc
IgorGanapolsky
7

Mein Problem dabei grepist, dass es ein ganzzeiliger Parser ist. In Ihrem Beispiel suchen Sie nach "abc", ziehen jedoch die Instanz von zurück grep(dh "abc"). Ein bisschen kreisförmig. Sie können das herausfiltern, aber ich finde das alles etwas pervers.

Ich würde mich awkfür ein wenig Schnickschnack wenden .

ps aux | awk '$12=="abc.sh"'

awkTeilt die Zeilen basierend auf dem Leerzeichen in Felder auf (standardmäßig). Felder $ 11 + sind die Befehlsspalte (n). Wenn also der Befehl "sh abc.sh ..." lautet, $11wird shund $12wird dies sein abc.sh.

Wenn Sie den Ausgang oder die Kette mit den Tasten &&und steuern möchten|| Operatoren , können Sie, aber Sie müssen ein bisschen schlauer sein. grepWird mit Statuscode 1 beendet (technischer Fehler, Auslöser ||), wenn nichts gefunden awkwird. Wird jedoch immer mit Code 0 beendet. Sie können dies ändern, indem Sie angeben, dass der Vorgang beendet werden soll, wenn etwas gefunden wird, und eine 1 auslösen, wenn dies nicht der Fall ist:

ps aux | awk '$12=="abc.sh" {exit 0} END{exit 1}' && echo running || echo not running

Wenn Sie nur die Ausgabe auf den Bildschirm schreiben möchten, können Sie dies natürlich auf folgende Weise tun awk:

ps aux | awk '$12=="abc.sh" {print "running"; exit} END{print "not running"}'
Oli
quelle
4

Der richtige Weg, um in der aktuellen Bash-Sitzung zu prüfen, ob ein Prozess im Hintergrund gestartet wurde, wie z sh abc.sh & bereits ausgeführt wird oder nicht, besteht in der Verwendung des jobsintegrierten Befehls.

Beispiel:

$ sh abc.sh &
[1] 6917
$ jobs
[1]+  Running                 sh abc.sh &

Das bedeutet, dass der sh abc.shim Hintergrund gestartete Prozess ausgeführt wird. Wenn der Vorgang abgeschlossen ist, wird Folgendes angezeigt:

[1]+  Done                    sh abc.sh

Wenn im Hintergrund mehrere Prozesse ausgeführt werden, können Sie die Ausgabe nur auf den sh abc.shProzess beschränken, indem Sie Folgendes verwenden:

jobs sh

Siehe help jobsfür weitere Informationen.

Die obige Methode funktioniert nur in der aktuellen Bash-Sitzung. Wenn Sie sich jedoch in einer anderen Bash-Sitzung befinden (z. B. in einem anderen Terminalfenster oder einer anderen Registerkarte oder in einem Skript), abgesehen von:

ps aux | grep "[s]h bin/test.sh"

Sie können auch verwenden:

pgrep -a sh

was mir einfacher erscheint. Wenn Sie Ihren eingegebenen Befehl in der Ausgabe sehen ( sh abc.shin diesem Fall), bedeutet dies, dass der Prozess noch ausgeführt wird. Wenn nicht, ist der Vorgang beendet.

Radu Rădeanu
quelle
3

Wenn Ihr Skript gerade ausgeführt wird, muss es per ps auxBefehl angezeigt werden . Wenn es nicht von angezeigt wirdps , ist möglicherweise Ihre Skriptausführung derzeit beendet.

Eine Ausgabe pswie diese bedeutet, dass Ihr Skript derzeit nicht ausgeführt wird.

$ ps aux | grep hm.sh
avinash   6386  0.0  0.0  15940   932 pts/16   S+   17:34   0:00 grep --color=auto hm.sh

Wenn dies so angezeigt wird, wird Ihr Skript gerade ausgeführt.

$ ps aux | grep hm.sh
avinash   6454  0.0  0.0  16616  1384 pts/16   S+   17:35   0:00 /bin/bash ./hm.sh
avinash   6535  0.0  0.0  15940   932 pts/27   R+   17:35   0:00 grep --color=auto hm.sh

Es basiert alles auf dem Inhalt des Skripts.

Zum Beispiel, wenn Sie ein solches Skript erstellen. Es zeigt die Meldung HI bei der Ausführung an. Es dauert einige Sekunden, bis die Ausgabe angezeigt und beendet wird, nachdem das Endergebnis erstellt wurde.

#!/bin/bash
echo "HI"

Aber wenn Ihr Skript so ist,

#!/bin/bash
sudo apt-get update

Es dauert einige Minuten, bis der Vorgang beendet ist. Wenn Sie in der Zwischenzeit den ps aux | grep filenameBefehl ausführen , wird er in der Ausgabe angezeigt. Weil das Skript gerade läuft.

Avinash Raj
quelle
-2
  • Wenn Sie alle Prozesse überprüfen möchten, verwenden Sie 'top'.

  • Wenn Sie wissen möchten, welche Prozesse von Java ausgeführt werden, verwenden Sie ps -ef | grep java

  • wenn andere verfahren dann einfach nutzen ps -ef | grep xyzoder einfach/etc/init.d xyz status

  • wenn durch irgendeinen Code wie .shdann./xyz.sh status

Umman
quelle
1
-1 Obwohl diese Befehle unter bestimmten Umständen nützlich sind, sind sie für jemanden, der diese Umstände nicht kennt, dennoch unbrauchbar. In jedem Fall erklärst du sie entweder nicht genug oder deine Erklärung ist falsch.
David Foerster
-2

Wenn Sie nur überprüfen möchten, ob ein Vorgang ausgeführt wird, gehen Sie in dieses Verzeichnis und geben ll -trSie ein, ob am Ende der Datei ein .csvoder .workusw. angezeigt wird. Andernfalls wird der Vorgang ausgeführt.

Umman
quelle
Diese Antwort macht keinen Sinn. Wenn Sie den Inhalt eines Verzeichnisses auflisten, erfahren Sie nicht, ob ein Prozess ausgeführt wird. Die Dateierweiterung .csvgilt für durch Kommas getrennte Dateien, die nicht mit einem laufenden Prozess zusammenhängen.
user369450