Wie kann ich alle Prozesse mit einem bestimmten Teilnamen beenden? [geschlossen]

622

Ich möchte alle Prozesse beenden, durch die ich komme:

ps aux | grep my_pattern

Wie es geht?

Das funktioniert nicht:

pkill my_pattern
Łukasz Lew
quelle
11
Ist my_patterneinfach eine Teilzeichenfolge des Namens oder enthält sie Regex-Sonderzeichen?
Sven Marnach

Antworten:

1317

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

pkill -f my_pattern
Dor Shemer
quelle
7
@ Jayan: Es ist auch ziemlich wahllos in seiner Tötung. Es ist überraschend leicht zu misshandeln ...
thkala
1
@ Jayan: Du wirst mich nicht überzeugen :-). Ich wurde viel zu oft von Skripten von Drittanbietern verbrannt, die darauf bestanden, sie zu verwenden. pkillDer häufigste Fehler war die Annahme, dass zu einem bestimmten Zeitpunkt nur eine Instanz jeder Binärdatei vorhanden sein könnte.
Thkala
4
Für alle Mac-Benutzer, die diese Antwort wie ich finden, ist das Mac-Äquivalent killall -m my_pattern.
Zev Eisenberg
1
Wenn Sie eine Reihe von Hängeprozessen haben, die nicht getötet werden, verwenden Sie pkill -f -9, um sie gnadenlos zu töten
MacK
18
Ich empfehle, pgrepzuerst zu verwenden, um zu überprüfen, was Sie töten werden. Sie können verwenden pgrep -l, um Prozessnamen oder pgrep -avollständige Befehlszeilen anzuzeigen. Es verwendet die gleichen Flags wie pkill. In diesem Fall könnten Sie also verwenden pgrep -fa my_pattern.
Studgeek
158

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?

Das ps -eferstellt eine Liste der Prozess-IDs auf dem Computer, die für diesen Benutzer sichtbar sind. Das Pipe-Grep filtert dies nach Zeilen, die diese Zeichenfolge enthalten. Die grep -v grepSprüche stimmen nicht mit dem Prozess selbst überein, der das Greppen durchführt. Der Pipe-Awk-Druck besagt, dass die Zeilen im Standard-Trennzeichen-Leerzeichen aufgeteilt und in die zweite Spalte gefiltert werden, die unsere Prozess-ID ist. Die Pipe-Xargs starten einen neuen Prozess, an den alle diese Pids gesendet werden, kill -9und beenden sie alle.

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

  1. Wenn der erzwungene Code Datenbankoperationen oder sichere Transaktionen mit Race-Bedingungen mit geringer Wahrscheinlichkeit ausführt, wird in einem Bruchteil eines Prozent der Fälle die Atomizität dieser Transaktion zerstört, was zu undefiniertem Verhalten führt. töten -9 macht keine Gefangenen. Wenn Ihr Code diesbezüglich empfindlich ist, versuchen Sie, das xargs killTeil durch ein übertragenes Flag zu ersetzen, das ein ordnungsgemäßes Herunterfahren anfordert, und nur dann, wenn diese Anforderung abgelehnt wirdkill -9

  2. Es besteht die Möglichkeit, dass Sie versehentlich das Betriebssystem beenden oder undefiniertes Verhalten in einem nicht verwandten Prozess verursachen, was zu einer Instabilität des gesamten Systems führt, da ps -efalle möglichen Prozesse aufgelistet werden, die existieren könnten, und Sie nicht sicher sein können, ob eine seltsame Bibliothek eines Drittanbieters Ihre gemeinsam nutzt Prozessname oder dass in der Zeit zwischen Lesen und Ausführen von kill -9 die Prozess-ID in etwas anderes geändert wurde und Sie nun versehentlich einen zufälligen Prozess beendet haben, den Sie nicht beabsichtigt hatten.

Aber, wenn Sie die Risiken und Kontrolle für sie mit sehr eindeutigen Namen verstehen, und du bist ok mit ein paar fiel Transaktionen oder gelegentliche Korruption in Daten, dann 99,9% der Zeit yer gonna be fine. Wenn es ein Problem gibt, starten Sie den Computer neu und stellen Sie sicher, dass keine Prozesskollisionen vorliegen. Aufgrund dieses Codes wird das Skript für den technischen Support: "Haben Sie versucht, Ihren Computer neu zu starten?" Zu einem Mem der Stufe 5.

Eric Leschinski
quelle
15
Dies löst einen Fehler aus, wenn kein Prozess gefunden wird, der mit dem Namen übereinstimmt. Möglicherweise möchten Sie verwenden ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9, damit xargs den Befehl nicht ausführt, wenn keine Argumente angegeben werden.
Epigene
2
Nur eine kleine Änderung, vielleicht ist es besser, den Prozessnamen zu zitieren: ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9 Ohne Anführungszeichen wurde beim ersten Durchlauf nur einer meiner Hintergrundprozesse beendet. Das erneute Ausführen tötete den Rest.
Ali Haider
-rOption existiert unter OS X nicht, so scheint es.
Danijel
52

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

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

Sie können grep -e usw. verwenden.

Eugen Rieck
quelle
4
-1 Sie brauchen keine Schleife, Sie können nur kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`(beachten Sie auch das Refactoring; siehe auch meinen Kommentar zur Antwort von @ syntizerizerpatel).
Tripleee
11
@tripleee Kein Problem mit Ihrer Abstimmung, aber Sie stellen fest , dass der OQ "Ich möchte alle Prozesse beenden , die ich erhalte : ps aux | grep my_pattern" , den ich pflichtgemäß akzeptiert habe.
Eugen Rieck
Kill beendet alle Prozesse auf einmal, dafür brauchen Sie keine Schleife. Wenn die psdrei Prozesse 123, 234 und 345 zurückgegeben werden, können Sie kill 123 234 345genau wie Sie rmoder catmehrere Dateiargumente.
Tripleee
@tripleee Ich erwähne das Entfernen dergrep
Eugen Rieck
for KILLPID in ps ax | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; doneentfernt den grep
Justin E
18

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 }') 
Nived Thanima
quelle
Mit dem folgenden Befehl können Sie den Prozess ps aux | auflisten grep -c myProcessName Wenn Sie die Anzahl dieser Prozesse überprüfen müssen, führen Sie ps aux | aus grep -c myProcessName | grep -v grep Danach können Sie den Prozess mit kill -9 $ beenden (ps aux | grep -e myProcessName | awk '{print $ 2}')
Nived Thanima
13

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

killall -r my_pattern
Alex
quelle
8

Wenn Sie pkill -f PATTERNein bisschen zu gefährlich beurteilen , habe ich ezkill ein Bash-Skript geschrieben, das Sie auffordert, auszuwählen, welche Prozesse unter denen mit dem MUSTER übereinstimmen, das Sie beenden möchten.

kraymer
quelle
7

Sie können den folgenden Befehl verwenden, um

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

Wenn Sie keine Kopfschmerzen beim Finden der Prozess-ID haben möchten, verwenden Sie Regexp, um den Prozess nach Namen zu beenden. Um beispielsweise Chrome zu töten, reicht der folgende Code aus.

killall -r --regexp chrome

Ajaz
quelle
1
Sie benötigen nur entweder -r oder --regexp , dh die Short- bzw. die GNU-Long-Option.
BigSmoke
3

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.

Luis Lopes
quelle
1
Willkommen bei StackOverflow. Verwenden Sie für Ihre Codezeilen einen 4-Leerzeichen- oder Tabulator-Einzug, damit diese als Codeblöcke formatiert werden. Mit
freundlichen
2

Hört sich schlecht an?

 pkill `pidof myprocess`

Beispiel:

# kill all java processes
pkill `pidof java`
user6482587
quelle
2

Es wurde der beste Weg gefunden, dies für einen Server zu tun, der dies nicht unterstützt pkill

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

Sie müssen nicht schleifen.

Magige Daniel
quelle
1

Es ist am besten und sichersten, pgrep -fmit killoder nur pkill -fmit der Ausgabe von greping zu arbeiten ps.

Im Gegensatz zu der Verwendung, ps | grepbei der Sie die Grep-Linie durch Hinzufügen | grep -voder Verwenden von Mustertricks herausfiltern müssen , pgrepwird sie sich nicht von selbst auswählen.

Sollte Ihr Muster in psder UID/ USER, SDATE/ STARToder einer anderen Spalte erscheinen, werden unerwünschte Prozesse in der Ausgabe angezeigt und beendet, pgrep+pkill Leiden Sie nicht unter diesem Fehler.

Ich fand auch , dass killall -r/ -regexp nicht mit meinem regulären Ausdruck arbeitete.

pkill -f "^python3 path/to/my_script$"

man pkill

Wis
quelle
0

Ich nahm Eugen Riecks Antwort und arbeitete damit. Mein Code fügt Folgendes hinzu:

  1. ps ax enthält grep, also habe ich es mit ausgeschlossen grep -Eiv 'grep'
  2. Einige ifs und Echos wurden hinzugefügt, um die Lesbarkeit zu verbessern.

Ich habe eine Datei erstellt, mit dem Namen es killserver, hier geht es:

#!/bin/bash
PROCESS_TO_KILL=bin/node
PROCESS_LIST=`ps ax | grep -Ei ${PROCESS_TO_KILL} | grep -Eiv 'grep' | awk ' { print $1;}'`
KILLED=
for KILLPID in $PROCESS_LIST; do
  if [ ! -z $KILLPID ];then
    kill -9 $KILLPID
    echo "Killed PID ${KILLPID}"
    KILLED=yes
  fi
done

if [ -z $KILLED ];then
    echo "Didn't kill anything"
fi

Ergebnisse

  myapp git:(master) bash killserver
Killed PID 3358
Killed PID 3382
Killed
  myapp git:(master) bash killserver
Didn't kill anything
Meir Gabay
quelle
0

Das ist der Weg:

kill -9 $(pgrep -d' ' -f chrome)
MadMad666
quelle
3
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
Igor F.