Ich verwende oft bash
Shell-Skripte, um einfache Befehle für viele verschiedene Dateien auszuführen. Angenommen, dass ich den folgenden habe bash
Shell - Skript, genannt script.sh
, die das Programm / Befehl läuft foo
auf drei Textdateien "a.txt"
, "b.txt"
, "c.txt"
:
#!/bin/bash
for strname in "a" "b" "c"
do
foo $strname".txt"
done
Angenommen, dies foo $strname".txt"
ist langsam, sodass die Ausführung des Skripts viel Zeit in Anspruch nimmt (z. B. Stunden oder Tage). Aus diesem Grund möchte ich verwenden nohup
, dass die Ausführung auch dann fortgesetzt wird, wenn das Terminal geschlossen oder nicht verbunden ist. Ich möchte auch, dass das Skript sofort in den Hintergrund tritt, also verwende ich den &
Operator. Daher werde ich den folgenden Befehl zum Aufrufen verwenden script.sh
:
nohup bash script.sh &
Dies funktioniert einwandfrei, wenn das Skript im Hintergrund und ohne Auflegen ausgeführt wird. Angenommen, ich möchte die Ausführung aus irgendeinem Grund irgendwann abbrechen. Wie kann ich das machen?
Das Problem, auf das ich gestoßen bin, ist, dass ich beim Betrachten top
nur das foo
Entsprechende sehe "a.txt"
. Ich kann diesen foo
Anruf beenden , aber dann wird das foo
entsprechende "b.txt"
angerufen, und dann muss ich das auch beenden, und so weiter. Für Dutzende oder Hunderte von Textdateien, die in der for
Schleife angegeben sind, wird es zum Schmerz, jede nach der anderen zu beenden foo
! Irgendwie muss ich stattdessen das Shell-Skript selbst beenden , nicht die speziellen Aufrufe, die vom Shell-Skript ausgegeben werden.
Wenn ich den Befehl eingebe
ps -u myusername
Wo myusername
ist mein Benutzername? Ich erhalte eine Liste der Prozesse, die ich ausführe. Ich sehe aber zwei unterschiedliche Prozess-IDs aufgerufen bash
. Woher weiß ich, welcher dieser Prozesse meinem ursprünglichen Aufruf entspricht nohup bash script.sh &
?
for s in a b c; do foo "$s".txt; done
nohup
bis Sie eine Prozessauflistung aufrufen, um den von Ihnen gestarteten Job anzuzeigen, ist das lange vorbei. Sie können sich die Spalte "Nizza" in derps
Ausgabe ansehen, aber die Antworten hier sind nützlicher.Antworten:
Standardmäßig
ps
werden die Parameter, mit denen das Programm aufgerufen wurde , nicht angezeigt . Die Optionen-f
und-l
beide zeigen den vollständigen Anruf an.führt zu einer Ausgabe, die wie folgt aussieht:
quelle
Sie haben mehrere Möglichkeiten. Da Ihr Prozess im Hintergrund ausgeführt wird, können Sie ihn folgendermaßen
jobs
suchen:Sie können auch
pkill
die Prozesstabelle nach einer Befehlszeilenübereinstimmung durchsuchen. nämlich:quelle
Die
ps
Ausgabe (mit z. B.ps aux
) enthält die Prozess-ID des übergeordneten Elements. Töte den Elternteilbash
und seine Kinder werden ebenfalls getötet.Versuchen Sie es
pstree -p
mit einigen Hintergrundprozessen , um eine ASCII-Visualisierung des Prozessbaums zu erhalten .quelle