Wie kann ich alle Prozesse mit dem angegebenen Namen beenden?

15

Ich führe ein Kommando aus ps -A | grep <application_name>und erhalte eine Liste von Prozessen wie folgt:

19440 ?        00:00:11 <application_name>
21630 ?        00:00:00 <application_name>
22694 ?        00:00:00 <application_name>

Ich möchte alle Prozess aus der Liste töten: 19440, 21630, 22694.

Ich habe es versucht, ps -A | grep <application_name> | xargs kill -9 $1aber es funktioniert mit Fehlern.

kill: illegal pid ?
kill: illegal pid 00:00:00
kill: illegal pid <application_name>

Wie kann ich das anmutig tun?

Łukasz D. Tulikowski
quelle

Antworten:

24
pkill -f <application_na>

Bricht alle Prozesse ab, <application_na>deren Namen das Muster enthalten .

Mann pkill

Katu
quelle
9

Das Problem ist, dass ps -A | grep <application_name> | xargs -n1die Ausgabe so zurückgegeben wird

19440
?
00:00:11
<application_name>
21630
?
00:00:00
<application_name>
22694
?
00:00:00
<application_name>

Sie können verwenden awk, um zuerst eine psAusgabespalte abzurufen .

ps -A | grep <application_name> | awk '{print $1}' | xargs -n1

Gibt eine Liste der PIDs zurück

19440
21630
22694

Und kill -9 $1wenn Sie hinzufügen , haben Sie einen Befehl, der alle PIDs löscht

ps -A | grep <application_name> | awk '{print $1}' | xargs kill -9 $1
Łukasz D. Tulikowski
quelle
das ist perfekt I Test auf Bash - Skript , es tötet die processer sofort ohne Fehler + auch wenn der Prozess is'nt begann es keine Fehler zeigt das ist , was ich will, hier zB von ffmpeg processer Killer nano /usr/bin/ffmpegk . . . . ps -A | grep ffmpeg | awk '{print $1}' | xargs kill -9 $1 . . . . chmod a+rx /usr/bin/ffmpegk
Salem F
Ich habe ein Problem damit, wo ich die Ausgabe von bekomme, kill -9wenn kein Prozess übereinstimmt
Daniel F
1
Stattdessen grepsollten Sie verwenden awk, um auf den Namen zu passen:ps -A | awk "\$4 == \"$1\" { print \$1; }"
Toby Speight
0

killall kann das tun.

$ killall application_name
rudimeier
quelle
Erlaubt kill all reguläre Ausdrücke in einem Anwendungsnamen?
Łukasz D. Tulikowski
killall --regexp "appl.*me"Es kann jedoch verschiedene Killall-Implementierungen geben. Sehen man killall.
Rudimeier
killall nicht genug manchmal muss ich es dreimal senden, um den Prozess kill -9 pidabzubrechen , und selbst wenn ich es nicht schaffe, ist @ ŁukaszD.Tulikowski die beste Arbeitslösung speziell für Bash-Skripte.
Salem F
-1
ps -eaf | grep -i applicationname| grep -iv 'grep'| awk '{print "kill -9" " "  $2}'|sh
Praveen Kumar BS
quelle
Während ich noch nicht über diese Frage abgestimmt habe, haben Sie nicht beschrieben, warum dies anders oder besser ist als die anderen Lösungen - die dieser sehr ähnlich sind - oder warum das OP Probleme mit ihrer Variation hatte.
Jeff Schaller
-2

Mein Ansatz ist dem von @ Łukasz D. Tulikowskiähnlich. Anstatt zu benutzen grep <application_name>; Ich habe verwendet grep "[a]pplication_name", was nicht mit seiner eigenen Prozessbefehlszeile übereinstimmt.

Der Ausdruck in eckigen Klammern ist Teil des grepZeichenklassen-Mustervergleichs. (Referenz) .


Sie können verwenden awk, um zuerst eine psAusgabespalte abzurufen.

ps -A | grep "[a]pplication_na" | awk '{print $2}' | xargs -n1

Gibt eine Liste der PIDs zurück

7644
407
406

Beim späteren Hinzufügen haben kill -9 $1Sie einen Befehl, der alle PIDs löscht

ps aux | grep "[a]pplication_na" | awk '{print $2}' | xargs kill -9 $1
alper
quelle
Warum das grepanstatt awkden Test korrekter zu machen? grepEntspricht beispielsweise Namen, die das Ziel als Teilzeichenfolge enthalten.
Toby Speight