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?
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?
Antworten:
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.
echo kill -9 $pid
sowieso 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?
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
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 beispielsweise pkill vi
alle Programme ab, deren Befehlsname die Teilzeichenfolge enthält vi
. Um nur aufgerufene Prozesse abzubrechen vi
, verwenden Sie pkill -x vi
. Um nur Prozesse abzubrechen, vi
deren letztes Argument auf endet .conf
, verwenden Sie pkill -fx 'vi.*\.conf'
.
Verwenden Sie zum Anzeigen der Liste der PIDs, an pkill
die 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 ps
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 Sie fuser -k
, um ihnen ein Signal zu senden. fuser -k /usr/bin/find
Tö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 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, laufen kill -1234
oder kill -HUP -1234
oder ein anderes Signal.
Wenn Sie keinen besseren Weg finden, verwenden Sie die ps
richtigen Optionen, um alle Prozesse aufzulisten und sie mit grep
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:
kill $(ps -o pid -o comm | awk '$2 == "vi" {print $1}')
Denken Sie daran, dass Ihr grep
oder awk
-Befehl möglicherweise in der ps
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 der ps
Ausgabe enthalten sind.
pkill
ist hier sehr schön. Sie können ihm viele Parameter geben, um das Muster zu verfeinern.
pkill
ist unter Linux, BSD und Solaris verfügbar - afaik. Es hat also eine größere Verbreitung als killall
.
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]
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 ich
kill -9 $(pidof <proc name>)
Der Nachteil dieser Lösung ist, dass reguläre Ausdrücke nicht verwendet werden können.
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
ps -ef
in pkill
oder zu pgrep
leiten? Diese Befehle werden nicht von der Standardeingabe gelesen.
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
process3ghi
dass auch der Prozess abgebrochen wird.
$ ps -eaf | grep "xyz" | grep -v grep | awk 'print $2' | xargs kill
ps -ef | pgrep -f "search" | xargs kill -9
pkill
fromprocps
package.