it-swarm.com.de

Beenden Sie viele Instanzen eines laufenden Prozesses mit einem Befehl

Angenommen, ich habe tausend oder mehr Instanzen eines Prozesses (z. B. vi). Wie töte ich sie alle in einem einzigen Schuss/einem Zeilenbefehl/einem Befehl?

80
The Dark Knight

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 im Grunde hat es immer für mich funktioniert.

105
EightBitTony

Verwenden Sie 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

39
daisy

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. Zum Beispiel beendet pkill vi Alle Programme, deren Befehlsname den Teilstring vi enthält. Verwenden Sie pkill -x vi, Um nur Prozesse mit dem Namen vi zu beenden. Verwenden Sie .conf, Um nur Prozesse mit dem Namen vi mit einem letzten Argument zu beenden, das auf pkill -fx 'vi.*\.conf' Endet.

Um die Liste der PIDs anzuzeigen, an die pkill ein Signal senden würde, verwenden Sie pgrep, das genau dieselbe Syntax hat, außer dass es keinen Signalnamen oder keine Signalnummer akzeptiert. Führen Sie Folgendes aus, um weitere Informationen zu diesen Prozessen anzuzeigen

ps -p "$(pgrep …)"

Unter Linux benötigen Sie stattdessen ps -p $(pgrep -d, …) (das ist ein Fehler: Linux ps ist nicht POSIX-kompatibel).

Ein weiterer gängiger Weg, um abzubrechende Prozesse zu identifizieren, sind Prozesse, bei denen eine bestimmte Datei geöffnet ist (die ausführbare Datei des Prozesses sein kann). Sie können diese mit fuser auflisten; Verwenden Sie fuser -k, um ihnen ein Signal zu senden. Zum Beispiel beendet fuser -k /usr/bin/find Alle laufenden Isntanzen von find.

Wenn es einen außer Kontrolle geratenen Prozess gibt, der immer wieder verzweigt, müssen Sie möglicherweise die gesamte Prozessgruppe auf einmal beenden. Eine Prozessgruppe wird durch das Negativ ihres Leiters identifiziert, der der Vorgängerprozess aller Prozesse in der Gruppe ist. Um die Prozessgruppe anzuzeigen, zu der ein Prozess gehört, führen Sie ps -o pgid Aus (plus eine beliebige Option, um auszuwählen, welche Prozesse angezeigt werden sollen). Wenn Sie feststellen, dass Sie den Prozessgruppenleiter 1234 und alle seine untergeordneten Elemente töten möchten, führen Sie kill -1234 Oder kill -HUP -1234 Oder ein anderes Signal aus.

Wenn Sie keinen besseren Weg finden, verwenden Sie ps mit den richtigen Optionen, um alle Prozesse aufzulisten und mit grep oder einem anderen Textfilterbefehl zu filtern. Achten Sie darauf, dass Sie nicht versehentlich mit anderen Prozessen übereinstimmen, die zufällig einen Befehl mit einem ähnlichen Namen oder einem Argument ausführen, das diesen Namen enthält. Zum Beispiel:

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

Denken Sie daran, dass Ihr Befehl grep oder awk selbst möglicherweise in der Ausgabe ps aufgeführt ist (ps und der Filterbefehl werden parallel gestartet, also ob dies der Fall ist auftauchen oder nicht ist abhängig vom Timing). Dies ist besonders wichtig, wenn die Befehlsargumente in der Ausgabe ps enthalten sind.

Am einfachsten ist es, zunächst zu überprüfen, ob Sie die richtigen Prozess-IDs erhalten mit:

pgrep -f [part_of_a_command]

Wenn das Ergebnis wie erwartet ist. Geh mit:

pkill -f [part_of_a_command]
7
Tahsin Turkoz

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

7
Nils

Interessanterweise erwähnte niemand diesen. pidof gibt durch Leerzeichen getrennte Pids von Prozessen aus, die mit dem übergebenen Prozessnamen übereinstimmen. Daher können Sie die Ausgabe direkt mit kill ohne Piping verwenden. Unter Arch Linux benutze ich

kill -9 $(pidof <proc name>)

Der Nachteil dieser Lösung besteht darin, dass keine regulären Ausdrücke verwendet werden können.

3
sherrellbc

Ich würde Ihnen vorschlagen, pkill zu versuchen.

Ex: ps -ef | pkill -f command

Um die Liste aller abzubrechenden Prozesse anzuzeigen, versuchen Sie zunächst pgrep:

Ex: ps -ef | pgrep -f command

1
Ankit Vashistha

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

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

Beachten Sie, dass dadurch der Prozess abgebrochen wird, der dem obigen Muster entspricht, dh process1abcprocess2defprocess3ghi wird auch getötet.

0
SandPox

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

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

0
Horv