Wie kann ich eine Bash stoppen, während die Schleife im Hintergrund läuft?

23

Ich habe eine while-Schleife wie folgt gestartet:

while true; do {command}; sleep 180; done &

Beachten Sie die &.

Ich dachte, als ich das Terminal getötet habe, würde diese while-Schleife aufhören. Aber es geht immer noch. Es sind Stunden vergangen, seit ich die Terminalsitzung beendet habe.

Wie stoppe ich diese while-Schleife?

Saqib Ali
quelle

Antworten:

38

ich begann

while true; do yad; sleep 60; done &

und schloss das Terminal, um es zu testen, jetzt habe ich das gleiche Problem.

Wenn Sie das Terminal bereits geschlossen haben, haben Sie die Schleife gestartet

Lassen Sie uns einen Überblick über laufende Prozesse mit ps fjxden letzten Zeilen auf meinem Rechner lesen

 2226 11606 11606 19337 ?           -1 S     1000   0:00  \_ /bin/bash
11606 22485 11606 19337 ?           -1 S     1000   0:00  |   \_ sleep 10
 2226  9411  9411  8383 ?           -1 S     1000   0:00  \_ /bin/bash
 9411 17674  9411  8383 ?           -1 Sl    1000   0:00      \_ yad
    1  2215  2215  2215 ?           -1 Ss    1000   0:00 /lib/systemd/systemd --user
 2215  2216  2215  2215 ?           -1 S     1000   0:00  \_ (sd-pam)

Sie können yadals Unterprozess von sehen /bin/bash, wenn ich es schließe yad, ändert sich sleep 60in der Ausgabe von ps. Wenn die Baumansicht zu verwirrend ist, können Sie die Ausgabe auch wie folgt durchsuchen 1 :

ps fjx | grep "[y]ad"  # or respectively
ps fjx | grep "[s]leep 60"

Die Ausgabezeilen beginnen mit zwei Zahlen, wobei die erste die PPID, die Prozess-ID des übergeordneten Prozesses und die zweite die PID, die ID des Prozesses selbst, ist. Das liegt daran, dass hier 9411in beiden Zeilen angezeigt wird:

2226  9411  9411  8383 ?           -1 S     1000   0:00  \_ /bin/bash
9411 17674  9411  8383 ?           -1 Sl    1000   0:00      \_ yad

Das ist die bashSubshell, die wir töten wollen, und wir haben gerade ihre PID herausgefunden. Jetzt ist alles, was übrig bleibt, eine einfache

kill 9411  # replace 9411 with the PID you found out!

und die nervige Unterschale ist endgültig weg.

1 : Die Notation verhindert grep "[y]ad"lediglich, grep yaddass der grepProzess selbst in der Ergebnisliste angezeigt wird.


Wenn Sie das Terminal noch geöffnet haben

bashStellt die Variable bereit $!, die "auf die Prozess-ID des zuletzt in den Hintergrund gestellten Jobs erweitert", sodass im Folgenden nur der letzte Prozess im Hintergrund abgebrochen wird:

kill $!

Wenn dies nicht der neueste Prozess ist, können Sie einfach eine Liste der ausgeführten Jobs mit der jobsintegrierten Beispielausgabe abrufen:

[1]-  Running                 while true; do
    yad; sleep 60;
done &
[2]+  Stopped                 sleep 10

Es gibt zwei Aufträge in der Auftragsliste, einen von ihnen zu töten Sie es mit der Auftragsnummer oder den Verknüpfungen zugreifen können %, %+( „current job“) und %-( „vorherigen Job“), zB um die Schleife zu töten im Hintergrund laufen Sie tun könnte

kill %1  # or
kill %-

und um den suspendierten sleep 10Job zu töten :

kill %2  # or
kill %+  # or
kill %
Dessert
quelle
5

Ich muss beachten, dass wenn Sie das Terminal schließen, in dem Sie diesen Befehl eingegeben haben, der Unterbefehl zusammen mit ihm hätte sterben müssen. Der Versuch, dies zu reproduzieren, zeigte dieses Verhalten.

Angenommen, Sie befinden sich tatsächlich in einer Situation, in der dies nicht der Fall war, können Sie das Programm, das Sie &am Ende des Befehls im Hintergrund ausgeführt haben, folgendermaßen beenden:

  1. Öffnen Sie eine neue Shell und führen Sie echo $$sie aus, um Ihre aktuelle PID (Prozess-ID) zu notieren, damit Sie Ihre eigene Sitzung nicht beenden.
  2. Identifizieren Sie die PID des Programms, von dem Sie glauben, dass es noch ausgeführt wird. Verwenden Sie dazu den ps -ef | grep $SHELLBefehl, um zu ermitteln, auf welchen Programmen eine Shell ausgeführt wird.
  3. Notieren Sie sich die zweite Spalte von links und den numerischen Wert, der von Ihrem obigen Ergebnis abweichtecho $$ . Dies ist die PID, die Sie töten möchten.
  4. Führen Sie den kill -SIGTERM <pid>Befehl aus. Dabei <pid>handelt es sich um den numerischen Wert, den Sie in Schritt 3 angegeben haben
  5. Bestätigen Sie, dass das Programm nicht mehr ausgeführt wird, indem Sie Schritt 2 wiederholen

Sie können auch Ihre Sitzung oder Ihren Computer neu starten. Mit den oben genannten Schritten können Sie dies jedoch vermeiden.

code_dredd
quelle
2
Sie können topden Vorgang auch abbrechen k, indem Sie drücken , die PID eingeben und dann zweimal die Eingabetaste drücken.
Luk3yx
-1

Die &machen das Terminal einen neuen Prozess erstellen und den Code im Innern zu laufen bekommen. So wird Ihr Code unabhängig vom Terminalprozess. Selbst wenn Sie das Terminal schließen, wird der neue Prozess, in dem Ihr Code ausgeführt wird, nicht angehalten. Also entweder entfernen &oder tun ps -aux, suchen Sie Ihren Prozess und beenden Sie ihn kill (process id).

Dr4ke der b4dass
quelle
-3

Normalerweise bg für Hintergrund fg für Vordergrund. Wenn Sie & symbol use fg verwenden, wird das aktuell ausgeführte Programm angezeigt. Drücken Sie Strg + C , um den Vorgang abzubrechen.

Neugierig
quelle
3
Die Verwendung von bg/ fgfunktioniert nicht, wenn das Terminal nicht mehr verbunden ist bash. Wäre nicht in der Lage, eine erneute Verbindung herzustellen, reptyrda bashuntergeordnete Prozesse ( sleep) vorhanden sind.
Xiota
Er hat das Terminal geschlossen, weil er diesen Prozess beenden wird. Also wird er das nächste Mal fg benutzen, um das Programm zu schließen. Simple
Curious
@Curious das ist das nächste Mal. Aber OP fragt nach dieser Zeit.
RonJohn