it-swarm.com.de

Wie kann ich alle Prozesse mit einem bestimmten Teilnamen beenden?

Ich möchte alle Prozesse abbrechen, die ich erhalte:

ps aux | grep my_pattern

Wie es geht?

Das funktioniert nicht:

pkill my_pattern
537
Łukasz Lew

Verwenden Sie pkill -f, das dem Muster für einen beliebigen Teil der Befehlszeile entspricht

pkill -f my_pattern
1169
Dor Shemer

Beenden Sie alle Prozesse, die mit der Zeichenfolge "myProcessName" übereinstimmen:

ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9

Quelle: http://www.commandlinefu.com/commands/view/1138/ps-ef-grep-process-grep-v-grep-awk-print-2-xargs-kill-9

Was macht dieser Code?

Der ps -ef erstellt eine Liste von Prozess-IDs auf dem Computer, die für diesen Benutzer sichtbar sind. Die Pipe grep filtert das nach Zeilen, die diese Zeichenfolge enthalten. Der grep -v grep sagt, dass der Prozess selbst, der das Greppen durchführt, nicht übereinstimmt. Der Pipe-Awk-Ausdruck besagt, dass die Zeilen in Standardtrennzeichen aufgeteilt und in die zweite Spalte gefiltert werden, die unsere Prozess-ID ist. Die Pipe xargs startet einen neuen Prozess, um alle diese Pids an kill -9 zu senden und sie alle zu beenden.

Der obige Code ist aus mehreren Gründen schlecht, gefährlich, hässlich und hackisch.

  1. Wenn der Code, dessen Beendigung erzwungen wird, Datenbankoperationen durchführt oder Transaktionen mit Race-Bedingungen mit geringer Wahrscheinlichkeit sichert, wird in einem Bruchteil eines Prozents der Zeit die Atomizität dieser Transaktion zerstört, was zu undefiniertem Verhalten führt. kill -9 macht keine Gefangenen. Wenn Ihr Code diesbezüglich empfindlich ist, versuchen Sie, den Teil xargs kill durch ein übertragenes Flag zu ersetzen, das ein ordnungsgemäßes Herunterfahren anfordert, und greifen Sie nur dann auf kill -9 zurück, wenn diese Anforderung abgelehnt wird.

  2. Es besteht die Möglichkeit, dass Sie das Betriebssystem versehentlich beenden oder undefiniertes Verhalten in einem nicht zusammenhängenden Prozess verursachen, was zu einer Instabilität des gesamten Systems führt, da ps -ef alle möglichen Prozesse auflistet, die existieren könnten, und Sie nicht sicher sind, ob ein seltsamer Prozess vorliegt Die Bibliothek eines Drittanbieters teilt Ihren Prozessnamen, oder dass sich die Prozess-ID zwischen Lesen und Ausführen von kill -9 in etwas anderes geändert hat und Sie nun versehentlich einen zufälligen Prozess beendet haben, den Sie nicht beabsichtigt haben.

Aber, wenn Sie die Risiken und die Kontrolle für sie mit sehr eindeutigen Namen verstehen und Sie mit einigen fehlgeschlagenen Transaktionen oder gelegentlicher Datenkorruption einverstanden sind, Dann wird es 99,9% der Zeit gut gehen. Wenn ein Problem auftritt, starten Sie den Computer neu und stellen Sie sicher, dass keine Prozesskollisionen vorliegen. Aufgrund des folgenden Codes wird das Skript für den technischen Support zu einem Meme der Stufe 5: "Haben Sie versucht, Ihren Computer neu zu starten?".

129
Eric Leschinski

Wenn Sie mehr Flexibilität bei der Auswahl der Prozesse benötigen, verwenden Sie

for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do 
  kill -9 $KILLPID;
done

Sie können grep -e usw. verwenden.

51
Eugen Rieck

mit dem folgenden Befehl können Sie den Prozess auflisten

ps aux | grep -c myProcessName 

wenn Sie die Anzahl dieser Prozesse überprüfen müssen, führen Sie sie aus

ps aux | grep -c myProcessName |grep -v grep 

danach können Sie den Prozess mit beenden

kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }') 
17
Nived Thanima

Sie können auch killall -r my_pattern verwenden. -r Interpretiere das Prozessnamenmuster als erweiterten regulären Ausdruck.

killall -r my_pattern
12
Alex

Wenn Sie pkill -f PATTERN für etwas zu gefährlich halten, habe ich ezkill ein Bash-Skript geschrieben, das Sie auffordert, die Prozesse auszuwählen, die mit dem zu tötenden MUSTER übereinstimmen.

8
kraymer

Sie können den folgenden Befehl verwenden, um

kill -9 $(ps aux | grep 'process' | grep -v 'grep' | awk '{print $2}')
6
Alex Liu

Wenn Sie keine Probleme beim Auffinden der Prozess-ID haben möchten, verwenden Sie regexp, um den Prozess nach Namen abzubrechen. Wenn Sie beispielsweise chrome töten, reicht der folgende Code aus.

killall -r --regexp chrome

4
ajaz

Sie können den folgenden Befehl verwenden, um:

ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9

oder

ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9

Für mich geht das.

3
Luis Lopes

Hört sich schlecht an?

 pkill `pidof myprocess`

beispiel:

# kill all Java processes
pkill `pidof Java`
2
user6482587

Den besten Weg gefunden, dies für einen Server zu tun, der 'pkill' nicht unterstützt

"kill -9 $ (ps axe | grep My_pattern | fgrep -v grep | awk '{print $ 1}')"

Sie müssen keine Schleife ausführen.

1
Magige Daniel

es ist am besten und sichersten, _pgrep -f_ mit kill zu verwenden, oder nur _pkill -f_, greping ps 's Ausgabe kann schief gehen.

Im Gegensatz zur Verwendung von _ps | grep_, mit dem Sie die grep-Zeile durch Hinzufügen von _| grep -v_ oder durch Verwendung von Mustertricks herausfiltern müssen, wird sich pgrep nicht von selbst auswählen.

Sollte Ihr Muster in pss UID/USER, SDATE/START oder einer anderen Spalte erscheinen, erhalten Sie unerwünschte Prozesse in der Ausgabe und töte sie, pgrep + pkill leide nicht unter diesem Fehler.

ich habe auch festgestellt, dass _killall -r_ / _-regexp_ nicht funktioniert hat Mein regulärer Ausdruck.

_pkill -f "^python3 path/to/my_script$"_

man pkill

1
Wis