@ 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:
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.
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
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.
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
-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
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.
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.
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.
Willkommen bei StackOverflow. Verwenden Sie für Ihre Codezeilen einen 4-Leerzeichen- oder Tabulator-Einzug, damit diese als Codeblöcke formatiert werden. Mit
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.
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.
my_pattern
einfach eine Teilzeichenfolge des Namens oder enthält sie Regex-Sonderzeichen?Antworten:
Verwenden Sie
pkill -f
diese Option , die dem Muster für einen beliebigen Teil der Befehlszeile entsprichtquelle
pkill
Der häufigste Fehler war die Annahme, dass zu einem bestimmten Zeitpunkt nur eine Instanz jeder Binärdatei vorhanden sein könnte.killall -m my_pattern
.pgrep
zuerst zu verwenden, um zu überprüfen, was Sie töten werden. Sie können verwendenpgrep -l
, um Prozessnamen oderpgrep -a
vollständige Befehlszeilen anzuzeigen. Es verwendet die gleichen Flags wie pkill. In diesem Fall könnten Sie also verwendenpgrep -fa my_pattern
.Beenden Sie alle Prozesse, die mit der Zeichenfolge "myProcessName" übereinstimmen:
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 -ef
erstellt 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. Diegrep -v grep
Sprü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 -9
und beenden sie alle.Der obige Code ist aus mehreren Gründen schlecht, gefährlich, hässlich und hackisch.
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 kill
Teil durch ein übertragenes Flag zu ersetzen, das ein ordnungsgemäßes Herunterfahren anfordert, und nur dann, wenn diese Anforderung abgelehnt wirdkill -9
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 -ef
alle 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.
quelle
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.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.-r
Option existiert unter OS X nicht, so scheint es.Wenn Sie mehr Flexibilität bei der Auswahl der verwendeten Prozesse benötigen
Sie können grep -e usw. verwenden.
quelle
kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`
(beachten Sie auch das Refactoring; siehe auch meinen Kommentar zur Antwort von @ syntizerizerpatel).ps
drei Prozesse 123, 234 und 345 zurückgegeben werden, können Siekill 123 234 345
genau wie Sierm
odercat
mehrere Dateiargumente.grep
for KILLPID in
ps ax | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}'; do kill -9 $KILLPID; done
entfernt den grepMit dem folgenden Befehl können Sie den Prozess auflisten
Wenn Sie die Anzahl dieser Prozesse überprüfen müssen, führen Sie sie aus
Danach können Sie den Prozess mit beenden
quelle
Auch können Sie verwenden
killall -r my_pattern
.-r
Interpretieren Sie das Prozessnamenmuster als erweiterten regulären Ausdruck.quelle
Wenn Sie
pkill -f PATTERN
ein 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.quelle
Sie können den folgenden Befehl verwenden, um
quelle
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
quelle
-r
oder--regexp
, dh die Short- bzw. die GNU-Long-Option.Sie können den folgenden Befehl verwenden, um:
oder
Für mich geht das.
quelle
Hört sich schlecht an?
Beispiel:
quelle
Es wurde der beste Weg gefunden, dies für einen Server zu tun, der dies nicht unterstützt
pkill
Sie müssen nicht schleifen.
quelle
Es ist am besten und sichersten,
pgrep -f
mitkill
oder nurpkill -f
mit der Ausgabe vongrep
ing zu arbeitenps
.Im Gegensatz zu der Verwendung,
ps | grep
bei der Sie die Grep-Linie durch Hinzufügen| grep -v
oder Verwenden von Mustertricks herausfiltern müssen ,pgrep
wird sie sich nicht von selbst auswählen.Sollte Ihr Muster in
ps
derUID
/USER
,SDATE
/START
oder 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
quelle
Ich nahm Eugen Riecks Antwort und arbeitete damit. Mein Code fügt Folgendes hinzu:
ps ax
enthält grep, also habe ich es mit ausgeschlossengrep -Eiv 'grep'
Ich habe eine Datei erstellt, mit dem Namen es
killserver
, hier geht es:Ergebnisse
quelle
Das ist der Weg:
quelle