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.
^Z
keine Hintergrundjobs, es stoppt sie. Ein nachfolgender bg
Vorgang 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 sync
oder 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 jobs
Befehl, 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 Auftragsnummern
kann 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.%ce
Bezieht sich beispielsweise auf einen gestopptence
Job. Wenn ein Präfix mit mehr als einem Job übereinstimmt, meldet bash einen Fehler. Verwenden%?ce
bezieht sich dagegen auf jeden Job, der die Zeichenfolgece
in 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
%1
und %%
- 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 ps
oder vielleicht jobs -l
, und dann die PID erneut eingeben musste, was mühsam ist.
while true
mit 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 python
oder killall java
wenn etwas Nützliches irgendwo im System ausgeführt wird.