So beenden Sie mehrere Prozesse

21

um die PID des zu tötenden Prozesses zu finden:

pgrep <process command>

Ich benutze dann den Befehl kill, um die von zurückgegebene PID zu töten pgrep <process command>

kill <PID>

Können diese Befehle zu einem kombiniert werden, um die PID oder die PIDs zu löschen, die von zurückgegeben werden pgrep <process command>? Oder gibt es eine Methode, die mehrere Prozesse nach dem Befehlsnamen beendet?

So etwas wie : kill(pgrep <name of process>)

blauer Himmel
quelle
3
Hast du es versucht pkill? Alternativ können Sie verwenden möchten xargs.
MatthewRock
1
Beachten Sie, dass Manualpages auch für solche Dinge geeignet sind. Oft erfahren Sie nicht nur, wie Sie den Befehl verwenden, sondern auch über verwandte Befehle. In diesem Fall wird in der pgrepManpage pkillüberall erwähnt (da die beiden Befehle aus demselben Paket stammen).
Patrick

Antworten:

27

Sie können pkill verwenden:

pkill httpd

Möglicherweise möchten Sie auch die Prozessersetzung verwenden (obwohl dies nicht so klar ist):

kill $(pgrep command)

Und vielleicht möchten Sie Folgendes verwenden xargs:

pgrep command | xargs kill
MatthewRock
quelle
4
Ich habe in einer Antwort etwas Ähnliches gemacht und es wurde mir darauf hingewiesen, dass ich eine Rennbedingung eingeführt habe. Die Prozess-IDs können zwischen den Aufrufen von pgrepund ungültig werden kill. Verwenden Sie einfach pkill.
Kusalananda
3
@Kusalananda Das gleiche kann auch passieren pkill, wenn die Prozessliste abgerufen und das Signal tatsächlich gesendet wird. In diesem Fall ist es nur schwerer zu erkennen.
Hobbs
1
Ich wollte versuchen, eine Antwort zu verfassen, die so etwas wie eine Schleife enthält kill $(ps|head -1), um die Rennbedingungen zu umgehen ... aber es gibt wirklich keinen Weg, dies zu vermeiden. Der Prozess kann an jedem Punkt der Pipeline zum Erliegen kommen.
Ross Presser
Seien Sie vorsichtig mit pkill, da in einigen Programmen möglicherweise mehr als eine Instanz ausgeführt wird und Sie möglicherweise nicht alle beenden möchten. Das erste Ausführen von pgrep hilft, solange zwischen pgrep und pkill (race) kein anderes gestartet wird.
Joe
1
Selbst ein C-Programm kann die Rennbedingungen nicht umgehen, das Fenster wird nur kleiner. Die einzige Möglichkeit, dies wirklich atomar zu tun, besteht darin, einen Systemaufruf hinzuzufügen, der Prozesse nach Namen abbricht. Da Prozess-IDs in der Regel nicht sehr schnell wiederverwendet werden, besteht praktisch keine Gefahr.
Barmar
17

Sie können killallauch z

killall firefox

an SIGTERMalle firefoxProzesse senden .

Byte Commander
quelle
8
Beachten Sie, dass killalldies auf verschiedenen Unix-Systemen unterschiedliche Bedeutungen hat. Wenn Sie sich auf einem Nicht-Linux-System befinden, lesen Sie unbedingt die Dokumentation.
Random832
killall -KILL firefoxkann sich sooo lohnend anfühlen .
Pipe
Die Nichtportabilität von killallist, warum ich es nie benutze. Das Laufen killallauf einer Solaris-Box ist zum Beispiel katastrophal.
Patrick
9

Ja, Sie können eine Bash-Funktion verwenden und eine Schleife über die Ausgabe erstellen.

$ for proc in $(pgrep <process command>); do kill $proc; done
lcipriani
quelle
Ich bekommekill <no>:failed: operation not permitted
Timo
Wahrscheinlich haben Sie nicht über die richtigen Berechtigungen oder der Prozess existiert nicht mehr, finden Sie unter: superuser.com/questions/1175485/...
lcipriani
0

Sie können mehrere Prozesse mit Array beenden. In diesem Fall können Sie Optionen wie $ip, $hostnameoder etwas ähnliches.

ip=your_ip_address; declare -a arr=$(ps aux|grep tail|grep $ip|awk '{print $2}'); for pid in ${arr[@]}; do kill -9 $pid; done;
Vladyslav Greyswandir
quelle