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

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

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.


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)

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

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.


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!


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.


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}')     

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


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

-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>

Ich bekommekill: invalid argument f
Rosstex

1
Versuchen Sie, -f durch -
Tony O'Hagan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.