Wie kann ich alle Prozesse beenden, die einem Namen entsprechen?

260

Angenommen, ich möchte jeden Prozess beenden, der das Wort Amarok enthält. Ich kann die Befehle ausdrucken, die ich ausführen möchte. Aber wie kann ich die Shell dazu bringen, sie auszuführen? dh.

ps aux | grep -ie amarok | awk '{print "kill -9 " $2}'
Output:
kill -9 3052
kill -9 3071
kill -9 3076
kill -9 3077
kill -9 3079
kill -9 3080
kill -9 3082
kill -9 3083
kill -9 3084
kill -9 3085
kill -9 3086
kill -9 3087
kill -9 3088
kill -9 3089
kill -9 4031
PuercoPop
quelle
Fügen Sie | sh -xnach dem Rest der Befehlszeile?
Jonathan Leffler
7
Niemals kill -9für einen Prozess verwenden, siehe [Prozessmanagement] [1] [1]: mywiki.wooledge.org/… ...
Fredrik Pihl
Hinzu kommt, dass der Kill -9 nicht nur eine schlechte Idee ist, sondern auch die Tatsache, dass Sie versuchen, mehrere Prozesse über ihren Namen zu beenden. Der Name eines Prozesses ist nicht eindeutig und daher ein schlechter Kandidat für die Identifizierung.
Raul
Wird es auch den amarokxProzess beenden? Ich pkill vi, es tötet, supervisorctlwas "vi" im Wort enthält.
Gank
4
Dieser Artikel über die Nichtverwendung -9ist ziemlich wenig hilfreich - gibt es bessere Informationen darüber, warum Menschen ihn nicht verwenden sollten? Es heißt nur "nicht und feuere Leute, die es benutzen"; Aber alles, was ich jemals anderswo gesehen habe, kill -9 {pid}ist, wie man etwas tötet ...
Dwanderson

Antworten:

435

Von man 1 pkill

-f     The pattern is normally only matched against the process name.
       When -f is set, the full command line is used.

Was bedeutet zum Beispiel, wenn wir diese Zeilen in sehen ps aux:

apache   24268  0.0  2.6 388152 27116 ?        S    Jun13   0:10 /usr/sbin/httpd
apache   24272  0.0  2.6 387944 27104 ?        S    Jun13   0:09 /usr/sbin/httpd
apache   24319  0.0  2.6 387884 27316 ?        S    Jun15   0:04 /usr/sbin/httpd

Wir können sie alle mit der -fOption pkill töten :

pkill -f httpd
Tim Bielawa
quelle
1
Mir ist klar, dass dies das Thema dieser Frage nicht anspricht, aber es zeigt eine alternative und kürzere Methode, um das zu tun, was Sie versuchen zu tun.
Tim Bielawa
19
Für zusätzliche Kraft -9am Ende hinzufügen !
mlissner
Wird es auch den httpdxProzess beenden? Ich pkill vi, es tötet, supervisorctlwas "vi" im Wort enthält.
Gank
Genial - Ubuntu 18.04.1 LTS
Salathiel Genèse
Für Groß- und Kleinschreibung Streichhölzer verwenden -i, wie pkill -fi wine. Verwenden Sie zur Überprüfung vor und nach ps uax | grep -i wine.
Vulkanischer Rabe
207
ps aux | grep -ie amarok | awk '{print $2}' | xargs kill -9 

xargs (1): xargs - Konstruieren Sie Argumentlisten und führen Sie das Dienstprogramm aus. Hilfreich , wenn Sie wollen Rohr in Argumenten zu so etwas wie killoder lsoder so weiter.

Nektarios
quelle
3
Punkte für die Erwähnung von xargs - all dieses pgrep / pkill-Zeug ist alles sehr gut, aber xargs ist ein Allzweckwerkzeug und Standard unter jedem Linux / Unix.
Chrisdowney
4
"töten: Kein solcher Prozess"
Cerin
3
Cerin, das liegt daran, dass versucht wird, auch den Grep-Prozess zu beenden, der bereits abgeschlossen ist. Es sollte schon passen.
Costi Muraru
6
Es gibt einen kleinen Trick, um zu vermeiden, dass der grep-Prozess erfasst wird: ps aux | grep -ie [a] marok | awk '{print $ 2}' | Xargs töten -9
RCross
8
Sie können auch einen weiteren grep-Aufruf hinzufügen, um grep herauszufiltern (ich finde das leichter zu lesen / zu merken) ps aux | grep -ie amarok | grep -v grep | awk '{print $2}' | xargs kill -9 ( grep -vsteht für grep --invert)
driftcatcher
47

verwenden pgrep

kill -9 $(pgrep amarok)
Eric Fortis
quelle
26
noch eleganter:pkill -9 amarok
Glenn Jackman
1
pkill behandelt den Teil "Jeder Prozess, der das Wort <Wort> enthält" nativ, ohne weitere Pipes oder Prozesse zu erstellen. Siehe die Option -f für die vollständige Suche nach Prozessnamen, um die Notwendigkeit von pgrep zu beseitigen.
Tim Bielawa
2
Beachten Sie, dass pkill standardmäßig eine teilweise Übereinstimmung mit Prozessnamen ermöglicht. Dieser Befehl würde auch amarok2 töten, wenn er existiert. Verwenden Sie -x oder -f, wenn Sie genaue Namen angeben möchten.
user79878
Es wird scheitern, wenn die nicht für pgrep
alfredocambera
für die vollständige kill -9 $(pgrep -f amarok)
Namensübereinstimmung
27

Der sichere Weg, dies zu tun, ist:

pkill -f amarok
John Alexander Betts
quelle
1
Um dies hinzuzufügen, habe ich die -lFlagge hinzugefügt . Ich habe eigentlich nur einen Alias ​​erstellt pkill, pkill -fldamit ich so etwas ausführen kann, pkill jbossund es wird den Prozess ausspucken, den es gerade getötet hat.
Nland
Wird es auch den amarokxProzess beenden? Ich pkill vi, es tötet, supervisorctlwas "vi" im Wort enthält.
Gank
Wie unterscheidet sich das von der Top-Antwort (Tims)? Stimmt nur mit dem Beispielnamen überein, sieht sonst identisch aus? @ndland pkill: invalid option -- 'l'- pkill von procps-ng 3.3.12
Xen2050
18

Ich denke, dieser Befehl killall ist genau das, was Sie brauchen. Der Befehl wird als "Prozesse nach Namen beenden" beschrieben. Er ist einfach zu verwenden. Zum Beispiel

killall chrome

Dieser Befehl beendet den gesamten Prozess von Chrome. Hier ist ein Link zum Befehl killall

http://linux.about.com/library/cmd/blcmdl1_killall.htm

Hoffe, dieser Befehl könnte Ihnen helfen.

androidyue
quelle
Dies stimmt nur mit dem Namen überein, nicht mit der vollständigen Befehlszeile. Auf jeden Fall nicht dasselbe wie ps auxdie Ausgabe der Suche
Xen2050
12

pkill -x stimmt genau mit dem Prozessnamen überein.

pkill -x amarok

pkill -f ist ähnlich, erlaubt jedoch ein Muster für reguläre Ausdrücke.

Beachten Sie, dass pkill ohne andere Parameter (z. B. -x, -f) teilweise Übereinstimmungen mit Prozessnamen zulässt. "Pkill Amarok" würde also Amarok, Amarok Banana, Bananaamarok usw. töten.

Ich wünschte, -x wäre das Standardverhalten!

user79878
quelle
Wird es auch den amarokxProzess beenden? Ich pkill vi, es tötet, supervisorctlwas "vi" im Wort enthält.
Gank
@Gank, ja, irgendwo ein Prozessname mit "amarok".
user79878
Wie kann man nur Amarok anstelle von Amarokx töten?
Gank
1
@ Gank, -x Flagge. pkill -x amarok
user79878
4

Wenn Sie die Ausgabe eines Befehls ausführen möchten, können Sie ihn einfügen. $(...)Schauen Sie sich jedoch für Ihre spezifische Aufgabe die Befehle killallund an pkill.

Chen Levy
quelle
3

Sie können Ihre Ausgabe auch als Unterprozess bewerten, indem Sie alles mit Back Ticks umgeben oder in $ () einfügen:

`ps aux | grep -ie amarok | awk '{print "kill -9 " $2}'`

 $(ps aux | grep -ie amarok | awk '{print "kill -9 " $2}')     
Schuppen
quelle
3

versuche kill -s 9ps -ef |grep "Nov 11" |grep -v grep | awk '{print $2}' Um Prozesse vom 11. November zu töten oder töte -s 9 ps -ef |grep amarok|grep -v grep | awk '{print $2}' Um Prozesse zu töten, die das Wort Amarok enthalten

Victor Marrerp
quelle
0

Vielleicht die Befehle zur ausführbaren Datei hinzufügen, die Berechtigung + x setzen und dann ausführen?

ps aux | grep -ie amarok | awk '{print "kill -9 " $2}' > pk;chmod +x pk;./pk;rm pk
vova7865
quelle
-1

Wenn Sie Cygwin oder eine minimale Shell verwenden, die fehlt killall können Sie einfach dieses Skript verwenden:

killall.sh - Töte nach Prozessnamen.

#/bin/bash
ps -W | grep "$1" | awk '{print $1}' | xargs kill --

Verwendungszweck:

$ killall <process name>
Tony O'Hagan
quelle
Ich bekommekill: invalid argument f
Rosstex
1
Versuchen Sie, -f durch -
Tony O'Hagan