Beenden Sie mehrere Instanzen eines laufenden Prozesses mit einem Befehl
75
Angenommen, ich habe tausend oder mehr Instanzen eines Prozesses (zum Beispiel vi) ausgeführt. Wie kann ich sie alle in einem einzigen Schuss / einem Zeilenbefehl / einem Befehl töten?
Es ist unklar, auf welchen Systemen dies funktionieren soll. Zum Beispiel verwende ich unter Linux pkillfrom procpspackage.
Deer Hunter
Die Frage wurde aus allgemeiner Sicht gestellt. Ich kannte nur zwei Prozesse wie killall und awk / sed. Aber ich wollte wissen, ob es andere Möglichkeiten gibt, dies zu erreichen. Wenn es in verschiedenen Systemen unterschiedlich gemacht wird, dann möchte ich wissen, was in welchem. Es ist sehr umständlich zu googeln, stattdessen habe ich daran gedacht, mit allen von euch erfahrenen Leuten zu diskutieren.
The Dark Knight
Antworten:
97
Was ist los mit dem guten alten,
for pid in $(ps -ef | grep "some search" | awk '{print $2}'); do kill -9 $pid; done
Es gibt Möglichkeiten, dies effizienter zu gestalten.
for pid in $(ps -ef | awk '/some search/ {print $2}'); do kill -9 $pid; done
und andere Variationen, aber auf der Basisebene hat es immer für mich funktioniert.
Bis gewählt, wusste nur von der ersten Variante. Die zweite sieht effizienter aus, danke.
The Dark Knight
5
@TheDarkKnight Das Problem bei dieser Methode ist, dass Sie häufig mehr töten, als Sie beabsichtigt haben. Das Schreiben einer zuverlässigen Suche ist schwierig. Verwenden Sie unter Linux pkill , das die meisten Feinheiten verarbeitet.
Gilles
Ich bin mir nicht sicher, ob es so knifflig ist. Wenn Sie nach einer bestimmten Binärdatei suchen, kann dies ziemlich zuverlässig sein. Ich führe es echo kill -9 $pidsowieso immer als erstes aus, damit ich weiß, was ich bekomme. Ich bin nicht sicher pkill, ob AIX hat , das ist mein Brot und Butter UNIX. Und ist es wirklich schlimm genug, runtergewählt zu werden?
EightBitTony
1
Sofern nicht unbedingt erforderlich, sollten Sie den Prozess SIGTERM anstelle von SIGKILL senden.
Ich sollte hinzufügen, dass diese beiden Methoden nicht in allen Shells funktionieren, zum Beispiel nicht beicsh
non sequitor
38
Nutze killall,
killall vi
Dadurch werden alle Befehle mit dem Namen "vi" beendet.
Sie können auch ein Signal hinzufügen, z. B. SIGKILL
Richtig, Sie können auch das gewünschte Signal hinzufügen, z. B.killall -9 vi
Hola Soy Edu Feliz Navidad
1
Ich denke nicht, dass killall die Antwort ist: Das Töten per Datei funktioniert nur für ausführbare Dateien, die während der Ausführung geöffnet bleiben, dh unreine ausführbare Dateien können nicht auf diese Weise getötet werden. Die Eingabe von killall name hat möglicherweise nicht den gewünschten Effekt auf Nicht-Linux-Systemen, insbesondere wenn dies von einem privilegierten Benutzer ausgeführt wird. Was passiert, wenn ich versuche, viele Instanzen eines Nicht-Linux-Prozesses zu löschen? killall -w erkennt nicht, ob ein Prozess verschwindet und wird zwischen den Scans durch einen neuen Prozess mit derselben PID ersetzt. Wenn Prozesse ihren Namen ändern, kann killall sie möglicherweise nicht richtig zuordnen.
The Dark Knight
13
Bitte beachten Sie, dass dies nur unter Linux und BSD funktioniert. Auf Solaris und einigen anderen Systemen killallwird genau das getan, was der Name andeutet ... der Init-Prozess wird abgebrochen.
Bobby
2
Unter AIX werden "alle Prozesse, die Sie gestartet haben, mit Ausnahme derjenigen, die den Killall-Prozess erzeugen, abgebrochen".
EightBitTony
31
pkillist das, was ich empfehle, wenn es verfügbar ist ( Linux , FreeBSD , NetBSD , OpenBSD , Solaris ). Sie können Prozesse anhand des Befehlsnamens, der vollständigen Befehlszeile oder anderer Kriterien angeben. Bricht beispielsweise pkill vialle Programme ab, deren Befehlsname die Teilzeichenfolge enthält vi. Um nur aufgerufene Prozesse abzubrechen vi, verwenden Sie pkill -x vi. Um nur Prozesse abzubrechen, videren letztes Argument auf endet .conf, verwenden Sie pkill -fx 'vi.*\.conf'.
Verwenden Sie zum Anzeigen der Liste der PIDs, an pkilldie ein Signal gesendet werden würde pgrep, die genau die gleiche Syntax aufweisen, außer dass sie keinen Signalnamen oder keine Signalnummer akzeptieren. Führen Sie aus, um weitere Informationen zu diesen Prozessen anzuzeigen
ps -p "$(pgrep …)"
Unter Linux benötigen Sie ps -p $(pgrep -d, …)stattdessen (das ist ein Fehler: Linux psist nicht POSIX-kompatibel).
Ein weiterer gängiger Weg, um abzubrechende Prozesse zu identifizieren, sind die Prozesse, bei denen eine bestimmte Datei geöffnet ist (bei denen es sich um die ausführbare Datei des Prozesses handeln kann). Sie können diese mit fuserauflisten; Verwenden Sie fuser -k, um ihnen ein Signal zu senden. fuser -k /usr/bin/findTötet zum Beispiel alle laufenden Aktionen von find.
Wenn es einen außer Kontrolle geratenen Prozess gibt, müssen Sie möglicherweise die gesamte Prozessgruppe auf einmal beenden. Eine Prozessgruppe wird durch das Negativ ihres Führers identifiziert, der der Vorgängerprozess aller Prozesse in der Gruppe ist. Um die Prozessgruppe ps -o pgidanzuzeigen , zu der ein Prozess gehört, führen Sie ihn aus (und wählen Sie aus, welche Prozesse angezeigt werden sollen). Wenn Sie feststellen , dass Sie den Prozess Gruppenleiter 1234 und alle ihre Kinder töten wollen, laufen kill -1234oder kill -HUP -1234oder ein anderes Signal.
Wenn Sie keinen besseren Weg finden, verwenden Sie die psrichtigen Optionen, um alle Prozesse aufzulisten und sie mit grepoder einem anderen Textfilterungsbefehl zu filtern. Achten Sie darauf, andere Prozesse, die einen Befehl mit einem ähnlichen Namen ausführen, oder ein Argument, das diesen Namen enthält, nicht versehentlich zuzuordnen. Zum Beispiel:
Denken Sie daran, dass Ihr grepoder awk-Befehl möglicherweise in der psAusgabe aufgeführt ist ( psund der Filterungsbefehl parallel gestartet wird, sodass es vom Timing abhängt, ob er angezeigt wird oder nicht). Dies ist besonders wichtig, wenn die Befehlsargumente in der psAusgabe enthalten sind.
Nicht auf allen UNIX-Systemen verfügbar, und in der Frage wird kein bestimmtes UNIX- oder UNIX-ähnliches Betriebssystem erwähnt.
EightBitTony
@EightBitTony pkillist unter Linux, BSD und Solaris verfügbar - afaik. Es hat also eine größere Verbreitung als killall.
Nils
Ich stimme zu, aber killall ist noch problematischer, da es mehrere Tools mit demselben Namen gibt, die sich anscheinend dramatisch verhalten. Ich mag die Killall-Antworten auch nicht. pkill gibt es unter AIX oder HP-UX nicht und trotz der Meinung einiger Leute gibt es weltweit immer noch eine signifikante Basis von Nicht-Linux-UNIX.
EightBitTony
1
@EightBitTony Deshalb ist Ihre Antwort die akzeptierte. Aber ich würde es nicht unter Solaris verwenden (das ist auch Unix).
Nils
6
Am einfachsten überprüfen Sie zuerst, ob Sie die richtigen Prozess-IDs erhalten:
Interessanterweise erwähnte dies niemand. pidof gibt durch Leerzeichen getrennte Pids von Prozessen aus, die mit dem übergebenen Prozessnamen übereinstimmen. Als solches können Sie den Ausgang direkt killohne Verrohrung verwenden. Unter Arch Linux verwende ich
kill -9 $(pidof <proc name>)
Der Nachteil dieser Lösung ist, dass reguläre Ausdrücke nicht verwendet werden können.
Beachten Sie, dass hierdurch der Prozess abgebrochen wird, der dem obigen Muster entspricht. Das bedeutet, process1abcprocess2defprocess3ghidass auch der Prozess abgebrochen wird.
pkill
fromprocps
package.Antworten:
Was ist los mit dem guten alten,
Es gibt Möglichkeiten, dies effizienter zu gestalten.
und andere Variationen, aber auf der Basisebene hat es immer für mich funktioniert.
quelle
echo kill -9 $pid
sowieso immer als erstes aus, damit ich weiß, was ich bekomme. Ich bin nicht sicherpkill
, ob AIX hat , das ist mein Brot und Butter UNIX. Und ist es wirklich schlimm genug, runtergewählt zu werden?csh
Nutze killall,
killall vi
Dadurch werden alle Befehle mit dem Namen "vi" beendet.
Sie können auch ein Signal hinzufügen, z. B. SIGKILL
killall -9 vi
quelle
killall -9 vi
killall
wird genau das getan, was der Name andeutet ... der Init-Prozess wird abgebrochen.pkill
ist das, was ich empfehle, wenn es verfügbar ist ( Linux , FreeBSD , NetBSD , OpenBSD , Solaris ). Sie können Prozesse anhand des Befehlsnamens, der vollständigen Befehlszeile oder anderer Kriterien angeben. Bricht beispielsweisepkill vi
alle Programme ab, deren Befehlsname die Teilzeichenfolge enthältvi
. Um nur aufgerufene Prozesse abzubrechenvi
, verwenden Siepkill -x vi
. Um nur Prozesse abzubrechen,vi
deren letztes Argument auf endet.conf
, verwenden Siepkill -fx 'vi.*\.conf'
.Verwenden Sie zum Anzeigen der Liste der PIDs, an
pkill
die ein Signal gesendet werden würdepgrep
, die genau die gleiche Syntax aufweisen, außer dass sie keinen Signalnamen oder keine Signalnummer akzeptieren. Führen Sie aus, um weitere Informationen zu diesen Prozessen anzuzeigenUnter Linux benötigen Sie
ps -p $(pgrep -d, …)
stattdessen (das ist ein Fehler: Linuxps
ist nicht POSIX-kompatibel).Ein weiterer gängiger Weg, um abzubrechende Prozesse zu identifizieren, sind die Prozesse, bei denen eine bestimmte Datei geöffnet ist (bei denen es sich um die ausführbare Datei des Prozesses handeln kann). Sie können diese mit
fuser
auflisten; Verwenden Siefuser -k
, um ihnen ein Signal zu senden.fuser -k /usr/bin/find
Tötet zum Beispiel alle laufenden Aktionen vonfind
.Wenn es einen außer Kontrolle geratenen Prozess gibt, müssen Sie möglicherweise die gesamte Prozessgruppe auf einmal beenden. Eine Prozessgruppe wird durch das Negativ ihres Führers identifiziert, der der Vorgängerprozess aller Prozesse in der Gruppe ist. Um die Prozessgruppe
ps -o pgid
anzuzeigen , zu der ein Prozess gehört, führen Sie ihn aus (und wählen Sie aus, welche Prozesse angezeigt werden sollen). Wenn Sie feststellen , dass Sie den Prozess Gruppenleiter 1234 und alle ihre Kinder töten wollen, laufenkill -1234
oderkill -HUP -1234
oder ein anderes Signal.Wenn Sie keinen besseren Weg finden, verwenden Sie die
ps
richtigen Optionen, um alle Prozesse aufzulisten und sie mitgrep
oder einem anderen Textfilterungsbefehl zu filtern. Achten Sie darauf, andere Prozesse, die einen Befehl mit einem ähnlichen Namen ausführen, oder ein Argument, das diesen Namen enthält, nicht versehentlich zuzuordnen. Zum Beispiel:Denken Sie daran, dass Ihr
grep
oderawk
-Befehl möglicherweise in derps
Ausgabe aufgeführt ist (ps
und der Filterungsbefehl parallel gestartet wird, sodass es vom Timing abhängt, ob er angezeigt wird oder nicht). Dies ist besonders wichtig, wenn die Befehlsargumente in derps
Ausgabe enthalten sind.quelle
pkill
ist hier sehr schön. Sie können ihm viele Parameter geben, um das Muster zu verfeinern.quelle
pkill
ist unter Linux, BSD und Solaris verfügbar - afaik. Es hat also eine größere Verbreitung alskillall
.Am einfachsten überprüfen Sie zuerst, ob Sie die richtigen Prozess-IDs erhalten:
Wenn das Ergebnis wie erwartet ist. Geh mit:
quelle
pgrep -f "command name"
Interessanterweise erwähnte dies niemand. pidof gibt durch Leerzeichen getrennte Pids von Prozessen aus, die mit dem übergebenen Prozessnamen übereinstimmen. Als solches können Sie den Ausgang direkt
kill
ohne Verrohrung verwenden. Unter Arch Linux verwende ichkill -9 $(pidof <proc name>)
Der Nachteil dieser Lösung ist, dass reguläre Ausdrücke nicht verwendet werden können.
quelle
Ich würde Ihnen vorschlagen, es zu versuchen
pkill
.Ex:
ps -ef | pkill -f command
Um die Liste aller zu tötenden Prozesse anzuzeigen, versuchen Sie zunächst Folgendes
pgrep
:Ex:
ps -ef | pgrep -f command
quelle
ps -ef
inpkill
oder zupgrep
leiten? Diese Befehle werden nicht von der Standardeingabe gelesen.Mit dem folgenden Befehl können Sie mehrere verschiedene Prozesse beenden
Beachten Sie, dass hierdurch der Prozess abgebrochen wird, der dem obigen Muster entspricht. Das bedeutet,
process1abc
process2def
process3ghi
dass auch der Prozess abgebrochen wird.quelle
pgrep "name-of-application" | xargs kill -9
War einfach genug, um sich zu erinnern und hat gut für mich funktioniert.
quelle
quelle
quelle