it-swarm.com.de

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

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

Ich habe diese Q & A .

Aber ich habe keine konkrete Lösung bekommen. Das folgende Beispiel habe ich ausprobiert: Ich habe eine abc.sh -Datei erstellt und dieses Skript im Hintergrund ausgeführt, z. B. sh abc.sh &.

Jetzt läuft diese Datei im Hintergrund und ich führe den Befehl ps aux | grep "abc" aus.

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 laufende Skript abc.sh und führe denselben Befehl ps aux | grep "abc" 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?

31

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

In Ihrem Fall ist jedoch, da Sie den Prozess mit sh abc.sh ausgeführt haben, sh die ausgeführte Anwendung (Shell) und nicht abc.sh. Daher enthält ps aux nicht den Prozess abc.sh, aufgrund dessen grep kein Ergebnis liefern 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, der mit der Zeichenfolge sh an einer beliebigen Stelle in der Ausgabe von ps aux ausgeführt wird.

Sie sollten beachten, dass der Prozess "ausgeführt" wird, wenn die Ausgabe von ps auxSTAT als R hat. 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 Befehl top ausführen, um zu überprüfen, ob der Prozess ausgeführt wird oder sich im Ruhezustand befindet und wie viel CPU-LeistungRAM verbraucht wird. (Dadurch wird Ihr Prozess erneut als sh aufgeführt.).

Wenn Sie jedoch möchten, dass Ihr Prozess als abc.sh aufgeführt wird, 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 ändern Sie diese in #!/bin/bash für bash) und stellen Sie dann ausführbare Berechtigungen für den Prozess bereit, indem Sie Folgendes verwenden:

chmod +x /path/to/abc.sh

ersetzen Sie /path/to/ durch den Speicherort der abc.sh -Datei und führen Sie abc.sh mit aus

/path/to/abc.sh

ersetzen Sie erneut /path/to/ durch den Speicherort der abc.sh -Datei.

41
jobin

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

Ich würde mich an awk wenden, um ein wenig Aufsehen zu erregen.

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

awk teilt die Zeilen basierend auf dem Leerzeichen (standardmäßig) in Felder auf. Die Felder $ 11 + sind die Befehlsspalte (n). Wenn der Befehl "sh abc.sh ..." lautet, sind $11sh und $12abc.sh .

Wenn Sie die Ausgabe oder Verkettung mit den Operatoren && und || von Bash steuern möchten, können Sie dies, aber Sie müssen etwas schlauer sein. grep wird mit Statuscode 1 beendet (technischer Fehler, löst || aus), wenn nichts gefunden wird, aber awk wird immer Code 0 beenden etwas und wirf eine 1, 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 auch in awk tun:

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

Die richtige Möglichkeit, in der aktuellen Bash-Sitzung zu überprüfen, ob ein im Hintergrund gestarteter Prozess wie sh abc.sh & bereits ausgeführt wird oder nicht, besteht in der Verwendung des integrierten Befehls jobs.

Beispiel:

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

Das bedeutet, dass der im Hintergrund gestartete sh abc.sh -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 Prozess sh abc.sh beschränken, indem Sie Folgendes verwenden:

jobs sh

Siehe help jobs fü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), müssen Sie Folgendes beachten:

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.sh in diesem Fall), bedeutet dies, dass der Prozess noch ausgeführt wird. Wenn nicht, ist der Vorgang beendet.

4
Radu Rădeanu

Wenn Ihr Skript gerade ausgeführt wird, muss es mit dem Befehl ps aux angezeigt werden. Wenn es nicht von ps angezeigt wird, wird möglicherweise die Skriptausführung gerade abgebrochen.

Die Ausgabe von ps 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 endgültige Ergebnis erzielt 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 Befehl ps aux | grep filename ausführen, wird er in der Ausgabe angezeigt. Weil das Skript gerade läuft.

3
Avinash Raj