Wie töte ich die zuletzt erzeugte Hintergrundaufgabe unter Linux?
Beispiel:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Wie töte ich die zuletzt erzeugte Hintergrundaufgabe unter Linux?
Beispiel:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Antworten:
Dafür gibt es in bash eine spezielle Variable:
kill $!
$! wird auf die PID des zuletzt im Hintergrund ausgeführten Prozesses erweitert.
^Zkeine Hintergrundjobs, es stoppt sie. Ein nachfolgender bgVorgang führt den eigentlichen Hintergrund aus (setzt die Ausführung im Hintergrund fort) und $!funktioniert danach wie erwartet.
????steht für einen oder mehrere Befehle, die nach dem Kill ausgeführt werden sollen. Wenn einer dieser Befehle auf der Arbeit des Hintergrundprozesses beruht, sollten Sie alle Bereinigungs- oder Abschlussaufgaben berücksichtigen, die der Hintergrundprozess möglicherweise in einem Signalhandler nachher ausführt Empfangen eines (einfangbaren) Signals. Fügen Sie am besten ein wait(gefolgt von einem syncoder sogar einem sleep <n>) direkt vor dem ersten solchen "abhängigen" Befehl hinzu.
Sie können nach Jobnummer töten. Wenn Sie eine Aufgabe in den Hintergrund stellen, sehen Sie Folgendes:
$ ./script &
[1] 35341
Das [1]ist die Jobnummer und kann wie folgt referenziert werden:
$ kill %1
$ kill %% # Most recent background job
Verwenden Sie den jobsBefehl, um eine Liste der Auftragsnummern anzuzeigen . Mehr von man bash:
Es gibt verschiedene Möglichkeiten, auf einen Job in der Shell zu verweisen. Der Charakter
%führt einen Jobnamen ein. Die Auftragsnummernkann als bezeichnet werden%n. Ein Job kann auch mit einem Präfix des Namens bezeichnet werden, mit dem er gestartet wurde, oder mit einem Teilstring, der in der Befehlszeile angezeigt wird.%ceBezieht sich beispielsweise auf einen gestopptenceJob. Wenn ein Präfix mit mehr als einem Job übereinstimmt, meldet bash einen Fehler. Verwenden%?cebezieht sich dagegen auf jeden Job, der die Zeichenfolgecein der Befehlszeile enthält. Wenn der Teilstring mit mehr als einem Job übereinstimmt, meldet bash einen Fehler. Die Symbole%%und%+Verweisen Sie auf die Vorstellung der Shell vom aktuellen Job. Dies ist der letzte Job, der gestoppt wurde, während er im Vordergrund stand oder im Hintergrund gestartet wurde. Auf den vorherigen Job kann mit verwiesen werden%-. Bei der Ausgabe von Jobs (z. B. der Ausgabe des Jobs-Befehls) wird der aktuelle Job immer mit einem+und der vorherige Job mit einem gekennzeichnet-. Eine einzelne%(ohne zugehörige Jobspezifikation) bezieht sich auch auf den aktuellen Job.
set -m) aktivieren können , ist es für die interaktive Verwendung vorgesehen. Siehe stackoverflow.com/questions/690266/... auch
%1und %%- besonders. Einige Dinge sterben nicht bei Strg-C, daher müssen Sie sie bei Strg-Z drücken und dann kill -9 %%. Ein Beispiel, bei dem ich es nützlich fand, ist: while true; do mplayer <some unstable online radio>; date >> restarts.log; done- Strg-C bringt Sie nur zur nächsten Schleifeniteration. Bevor ich es tun musste psoder vielleicht jobs -l, und dann die PID erneut eingeben musste, was mühsam ist.
while truemit while sleep 1. Dies gibt Ihnen eine kurze Verzögerung vor dem Neustart, wenn Sie damit leben können. Wenn Sie zweimal Strg-C drücken, unterbricht der zweite den Schlaf, beendet ihn mit einem Ausgang ungleich Null und bricht aus der Schleife aus.
Dies sollte alle Hintergrundprozesse beenden:
jobs -p | xargs kill -9
kill -9 %%weniger
Dies ist eine nicht zum Thema gehörende Antwort, aber für diejenigen, die interessiert sind, ist sie möglicherweise wertvoll.
Wie in der Antwort von @John Kugelman bezieht sich% auf die Jobspezifikation. Wie kann man das effizient finden? Verwenden Sie den Befehl & pattern von less , anscheinend verwendet man weniger Pager (nicht so sicher). Geben Sie in man bash den Typ &% ein, und geben Sie mit Enter nur Zeilen ein, die '%' enthalten. dann Enter.
Verwenden Sie einfach den Befehl killall:
Killall Taskname
Für weitere Informationen und erweiterte Optionen geben Sie "man killall" ein.
killall pythonoder killall javawenn etwas Nützliches irgendwo im System ausgeführt wird.