858 Stimmen

Wie kann man alle Prozesse mit einem bestimmten Teilnamen beenden?

Ich möchte alle Prozesse, an denen ich vorbeikomme, beenden:

ps aux | grep my_pattern

Wie kann man das tun?

Das funktioniert nicht:

pkill my_pattern

1778voto

Dor Shemer Punkte 23080

Utilisez pkill -f , die das Muster für jeden Teil der Befehlszeile erfüllt

pkill -f my_pattern

Für den Fall, dass es nicht funktioniert, versuchen Sie, auch diese zu verwenden:

pkill -9 -f my_pattern

275voto

Eric Leschinski Punkte 134271

Beendet alle Prozesse, die der Zeichenkette "myProcessName" entsprechen:

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

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

Warum "ps pipe kill" vom Terminal aus schlecht ist:

Das Piping von Ganzzahlen, die Sie aus ps -ef à kill -9 ist schlecht, und Sie sollten sich schlecht fühlen, vor allem, wenn Sie Root oder ein Benutzer mit erhöhten Rechten sind, weil es Ihrem Prozess keine Chance gibt, Socket-Verbindungen sauber zu beenden, temporäre Dateien aufzuräumen, seine Kinder zu informieren, dass er weggeht oder seine Terminal-Eigenschaften zurückzusetzen.

Senden Sie stattdessen 15 und warten Sie ein oder zwei Sekunden, und wenn das nicht funktioniert nicht funktioniert, sende 2, und wenn das nicht funktioniert, sende 1. Wenn das nicht funktioniert, ENTFERNEN Sie die BINARY, denn das Programm verhält sich schlecht.

Grundsätzlich verwenden wir Unix Railgun nicht zum Schneiden der Hecken. https://porkmail.org/era/unix/award.html#kill

Erläuterung des obigen Befehls:

ps -ef erzeugt eine Liste der Prozess-IDs auf dem Computer, die für diesen Benutzer sichtbar sind. Die Pipe grep filtert diese Liste nach Zeilen, die diese Zeichenfolge enthalten. Die grep -v grep nicht mit dem Prozess selbst übereinstimmt, der das Grepping durchführt. Die Pipe awk print sagt, dass die Zeilen nach dem Standardtrennzeichen Whitespace aufgeteilt werden und nach der zweiten Spalte gefiltert wird, die unsere Prozess-ID ist. Die Pipe xargs startet einen neuen Prozess, um all diese Pid's zu senden kill -9 und beendet sie alle.

Warum ps pipe kill ist schlecht, gefährlich, hässlich und hakelig:

  1. Es besteht eine geringe Wahrscheinlichkeit, dass Sie versehentlich das Betriebssystem beenden oder ein undefiniertes Verhalten in einem nicht verwandten Prozess verursachen, was zu einer Instabilität des gesamten Systems führt, da ps -ef listet Tausende von Prozessen auf, und Sie können nicht sicher sein, dass ein Prozess eines Drittanbieters Ihren Prozessnamen teilt, oder dass sich in der Zeit zwischen dem Lesen und dem Ausführen von kill -9 die processid in etwas anderes geändert hat und Sie nun einen zufälligen notwendigen Prozess beendet haben, der nichts mit Ihrem zu tun hat.

  2. Wenn der Code, der zwangsweise beendet wird, Datenbankoperationen oder sichere Transaktionen mit wenig wahrscheinlichen Wettlaufbedingungen durchführt, 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 dafür empfindlich ist, versuchen Sie, die xargs kill Teil mit einem übermittelten Flag, das eine ordnungsgemäße Abschaltung anfordert, und nur wenn diese Anforderung verweigert wird, als letztes Mittel auf kill -9

Aber, Wenn Sie sich aller Risiken bewusst sind und sie mit eindeutigen Namen kontrollieren, und wenn Sie mit ein paar fehlgeschlagenen Transaktionen oder gelegentlicher Korruption zurechtkommen, dann werden Sie in 99,9 % der Fälle keine Probleme haben. Wenn es ein Problem gibt, starten Sie den Computer neu und stellen Sie sicher, dass es keine Prozesskollisionen gibt. Wegen Code wie diesem wird das Skript des technischen Supports erstellt: "Haben Sie versucht, Ihren Computer neu zu starten?" zu einem Meme der Stufe 5. "Ein Schurkenroboter kratzte ps um ganze Zahlen zu finden, und schickte diese an kill -9 Starten Sie daher den Computer neu, um das Problem zu beheben.

Warum verwenden Sie nicht einfach pkill was ist einfacher?

Dies ermöglicht mir eine manuelle Kontrolle, denn ps , grep , awk , kill y xargs sind plattformübergreifender Standard. Sie gibt die volle Kontrolle darüber, welche Regex-Engine zu verwenden ist, welcher Teil des Prozessnamens übereinstimmen soll, wie die Groß- und Kleinschreibung zu behandeln ist und wie die Ausnahmen zu verwalten sind.

pkill -f -e -c myProcessName

Macht bei mir das Gleiche, aber siehe man pkill hat unterschiedliche Verhaltensweisen, Flags und Regex-Engines zwischen Varianten von Linux, Mac, Zune-Bash und meinem Open-Source-Router. Also ja, geben Sie Ihre 35000 Watt Unix-Railgun in die fähigen Hände von pkill, um die Hecken zu stutzen. Schauen Sie, was passiert.

57voto

Eugen Rieck Punkte 63066

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.

21voto

Können Sie den folgenden Befehl verwenden, um den Prozess aufzulisten

ps aux | grep -c myProcessName 

Wenn Sie den Zählerstand dieses Prozesses überprüfen müssen, führen Sie

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

Danach können Sie den Prozess mit

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

18voto

Alex Punkte 5426

Sie können auch Folgendes verwenden killall -r my_pattern . -r Interpretiert Prozessnamensmuster als erweiterten regulären Ausdruck.

killall -r my_pattern

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X