Ich möchte alle Prozesse beenden, durch die ich komme:
ps aux | grep my_pattern
Wie es geht?
Das funktioniert nicht:
pkill my_pattern
Ich möchte alle Prozesse beenden, durch die ich komme:
ps aux | grep my_pattern
Wie es geht?
Das funktioniert nicht:
pkill my_pattern
Antworten:
Verwenden Sie pkill -f
diese Option , die dem Muster für einen beliebigen Teil der Befehlszeile entspricht
pkill -f my_pattern
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 verwenden pgrep -l
, um Prozessnamen oder pgrep -a
vollständige Befehlszeilen anzuzeigen. Es verwendet die gleichen Flags wie pkill. In diesem Fall könnten Sie also verwenden pgrep -fa my_pattern
.
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r 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. Die grep -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.
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
for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do
kill -9 $KILLPID;
done
Sie können grep -e usw. verwenden.
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 Sie kill 123 234 345
genau wie Sie rm
oder cat
mehrere Dateiargumente.
grep
for KILLPID in
ps ax | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; done
entfernt den grep
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 }')
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
-r
oder --regexp
, dh die Short- bzw. die GNU-Long-Option.
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.
Hört sich schlecht an?
pkill `pidof myprocess`
Beispiel:
# kill all java processes
pkill `pidof java`
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.
Es ist am besten und sichersten, pgrep -f
mit kill
oder nur pkill -f
mit der Ausgabe von grep
ing zu arbeiten ps
.
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
der UID
/ 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$"
Ich nahm Eugen Riecks Antwort und arbeitete damit. Mein Code fügt Folgendes hinzu:
ps ax
enthält grep, also habe ich es mit ausgeschlossen grep -Eiv 'grep'
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
my_pattern
einfach eine Teilzeichenfolge des Namens oder enthält sie Regex-Sonderzeichen?