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?

Antworten:


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

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.


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 .


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

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)


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.


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.


0

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


4
Wenn ja pgrep, warum nicht einfach pkill -f dmn?
Muru
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.