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?


3
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.


1
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

killall -9 vi


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:

kill $(ps -o pid -o comm | awk '$2 == "vi" {print $1}')

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.


Vielen Dank, das ist wirklich großartig. Was Sie gegeben haben, ist eine Art Tutorial. Danke noch einmal . Up abgestimmt
The Dark Knight

6

pkillist hier sehr schön. Sie können ihm viele Parameter geben, um das Muster zu verfeinern.


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:

pgrep -f [part_of_a_command]

Wenn das Ergebnis wie erwartet ist. Geh mit:

pkill -f [part_of_a_command]

oder verwenden Sie:pgrep -f "command name"
Magne

3

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.


0

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


1
Was ist der Zweck, die Ausgabe von ps -efin pkilloder zu pgrepleiten? Diese Befehle werden nicht von der Standardeingabe gelesen.
Kusalananda

0

Mit dem folgenden Befehl können Sie mehrere verschiedene Prozesse beenden

pkill -9 -f "\.\/.+\s\.|process1|process2|process3\[^"

Beachten Sie, dass hierdurch der Prozess abgebrochen wird, der dem obigen Muster entspricht. Das bedeutet, process1abc process2def process3ghidass auch der Prozess abgebrochen wird.


-1

pgrep "name-of-application" | xargs kill -9

War einfach genug, um sich zu erinnern und hat gut für mich funktioniert.


-2
$ ps -eaf  | grep "xyz" | grep -v grep | awk 'print $2' | xargs kill

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.