Wie kann man eine Reihe von Prozessen unter Unix schnell stoppen?

8

So stoppen Sie eine Reihe von Prozessen unter Unix schnell.

Ich kann ps/ top, kill.

Wenn die Anzahl der Prozesse sehr groß ist, verwende ich ein Shell-Skript. Gibt es andere Möglichkeiten, nur ein oder zwei Unix-Befehle können es gut machen?


quelle
Haben Sie ein gemeinsames Namenspräfix für Ihre Prozesse?
Prinz John Wesley
1
Hier besteht die Gefahr, dass Sie etwas töten, das Sie nicht töten wollten, wenn Sie Prozesse schnell beenden.
ObscureRobot
telinit 0 oder kill -9 1 funktioniert gut, um ALLE Prozesse zu
beenden

Antworten:

10

Meine Wahl ist pkill/pgrep

Prinz John Wesley
quelle
Großartig! Um nur ein Beispiel zu nennen: Wenn Sie alle Curl-Prozesse beenden möchten, führen Sie zunächst pgrep -a curlalle Prozesse aus, die von beendet werden pkill. Wenn alles gut aussieht, verwenden Sie pkill curl.
Arun
3

Hier ist ein kleines Online-Bash-Skript, das ich verwende:

ps auxwww | grep -v grep | grep -i $1 | awk '{print $2}' | xargs kill -9

Ich beende alle Prozesse, deren Name den ersten Parameter enthält (ohne Berücksichtigung der Groß- und Kleinschreibung). Die Aufteilung jedes Teils ist:

  • ps auxwww druckt alle Prozesse mit einem sehr breiten "Befehls" -Feld
  • grep -v grep ist da, um sich vom Töten auszuschließen
  • grep -i $1 stimmt mit allen Zeilen überein, die den ersten Parameter enthalten
  • awk '{print $2}' greift auf alle Prozess-IDs zu
  • xargs kill -9 Bricht alle ausgewählten Prozesse ab
Bohemien
quelle
+1 Ich liebe eine gute Pipeline, besonders eine, die verwendet xargs.
Ich bevorzuge zu verwenden fgrep(keine Regex)
Prinz John Wesley
8
Dieses Skript ist im Vergleich zu übermäßig komplex pkill -9 -f $1. Empfehlen Sie auch nicht, Signal 9 (KILL) zu verwenden. Dies ist ein letzter Ausweg, um einen Prozess zu stoppen, und nicht einer, der routinemäßig angewendet werden sollte.
Jlliagre
0

Sehr schnelle Möglichkeit, mehrere Prozesse abzubrechen (ohne ein Skript schreiben zu müssen)

USAGE: ./autokill.kl.sh <proc-name> => This will give you 5 seconds to change your mind and control-C out of the program.

USAGE: ./autokill.kl.sh <proc-name> now => This will immediately kill all processes matching the string/pattern you specified!!!

MODEL: ./autokill.kl.sh httpd

MODEL: ./autokill.kl.sh httpd now

MODEL: ./autokill.kl.sh httpd view => This will only show you the list of processes matching the pattern you specified.

Das Skript kann hier direkt heruntergeladen werden .

NoStressing
quelle
0

Ich bevorzuge es wirklich, den Befehl pgrep / pkill zu verwenden. Hier ist ein Beispiel:

[root@testrhel7 ~]# pgrep -l http
2967 httpd
2968 httpd
2969 httpd
2970 httpd
2971 httpd
2972 httpd
[root@testrhel7 ~]#
[root@testrhel7 ~]# pkill -e http
httpd killed (pid 2967)
httpd killed (pid 2968)
httpd killed (pid 2969)
httpd killed (pid 2970)
httpd killed (pid 2971)
httpd killed (pid 2972)
[root@testrhel7 ~]#

Natürlich können Sie einen for-Zyklus verwenden:

[root@testrhel7 ~]# ps -ef  |grep http| grep -v grep
root       2989      1  0 16:06 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2990   2989  0 16:06 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2991   2989  0 16:06 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2992   2989  0 16:06 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2993   2989  0 16:06 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2994   2989  0 16:06 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
[root@testrhel7 ~]#

[root@testrhel7 ~]# for i in $(ps -ef | awk '/http/ {print $2}'); do kill -9 $i; done 

Ich hoffe das war hilfreich, fröhliches Töten.

Stoyan Radev
quelle