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 $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?
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
killallwird genau das getan, was der Name andeutet ... der Init-Prozess wird abgebrochen.
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.
pkillist hier sehr schön. Sie können ihm viele Parameter geben, um das Muster zu verfeinern.
pkillist 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 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.
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 -efin pkilloder zu pgrepleiten? 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 process3ghidass 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
pkillfromprocpspackage.