Wie man Argumente gibt, um über Pipe zu töten

80

Ich muss nach einem bestimmten Prozess suchen und diesen Prozess beenden. Ich habe einen Befehl wie diesen geschrieben:

ps -e | grep dmn | awk '{print $1}' | kill

Wo der Prozessname ist dmn. Aber es funktioniert nicht. Wie finde ich Prozesse nach Namen und nach killihnen?

user567879
quelle

Antworten:

156
kill $(ps -e | grep dmn | awk '{print $1}')
Daniel Persson
quelle
8
Verwenden Sie die neuere $()Syntax : kill $(ps -e | grep dmn | awk '{print $1}').
Stratus3D
7
Für andere musste ich diese Antwort ändern, damit sie funktioniert: Ich bin kill $(ps -efw | grep dmn | grep -v grep | awk '{print $2}')mir nicht sicher, warum und kümmere mich nicht genug darum.
Joshweir
1
@ Joshweir Es ist, weil sonst killversucht, sogar den 'grep'-Prozess zu
beenden
Wäre es nicht \nnach jedem Awk erforderlich , wie in awk '{print $1"\n"}'?
Sopalajo de Arrierez
43

Wenn Sie mehrere Prozesse entfernen möchten, können Sie Folgendes verwenden:

ps -efw | grep dmn | grep -v grep | awk '{print $2}' | xargs kill

Hinweis: Sie müssen den grep-Prozess selbst aus der Ausgabe entfernen. Deshalb grep -v grepwird er verwendet.

jcollado
quelle
17
Sie können verhindern, dass grep in Ihrem grep auftaucht, indem Sie das erste Zeichen in Klammern setzen, wie: grep [d] mn
Oldskool
1
@ Oldskool Netter Trick. Es ist eine gute Idee, Metazeichen zu verwenden, damit der reguläre Ausdruck grep nicht mit sich selbst übereinstimmt.
JCollado
@Oldskool, +1, du bist ein Genie!
jcr
Netter Trick, obwohl es komplizierter macht, sich in ein Shell-Skript zu verwandeln
Metagrapher
17

Du könntest benutzen

pkill dmn 

wenn Ihr System den Befehl pkill hat .

unutbu
quelle
1
+1 für pkill statt killall. Es ist auf mehreren Plattformen ohne unterschiedliche "Bedeutung" verfügbar ( killall unter Solaris entspricht beispielsweise killall5 unter Linux
dh
4

Ich füge nur andere hinzu, aber ich mag es, die Kapazität der Regex-Funktionen von awk zu nutzen:

kill $(ps | awk '/dmn/{print $1}')
Pedmiston
quelle
4

Wenn Sie den pidofBefehl auf Ihrem System haben (ich weiß, dass Shells wie ZSH standardmäßig mit diesem Befehl geliefert werden, sofern ich mich nicht irre), können Sie so etwas tun.

kill -9 $(pidof dmn)
Nathan F.
quelle
2

Sie brauchen das vielleicht nicht pipe, wenn Sie pidofBefehl haben und den Bildnamen kennen, habe ich es so gemacht:

kill $(pidof synergyc)

$()Ich verstehe dies, da es diese Ausgabe in eine Variable konvertiert, die kill verwenden kann, im Wesentlichen wie es Pipe tun würde. Kürzer und verständlicher als einige andere Optionen, aber möglicherweise auch weniger flexibel und direkter.

NotVeryPythonic
quelle
0
for procid in $(ps -aux | grep "some search" | awk '{print $2}'); do kill -9 $procid; done

hallo freunde .. wir können es mit for loop machen.

"Einige Suche" ist hier jeder Prozessname, den Sie suchen möchten, zum Beispiel "Java". Nehmen wir also an, die Anzahl der Java-Prozesse beträgt 200+, sodass das Beenden einer nach der anderen zu typisch ist.

Sie können also den obigen Befehl verwenden.

Vielen Dank.

Nishant
quelle
0

Mit der pgrepOption -f verwenden. kill $(pgrep -f dmn)

Deepak Sharma
quelle
4
Wenn ja pgrep, warum nicht einfach pkill -f dmn?
Muru