Comment tuer plusieurs processus

21

pour trouver le PID du processus à tuer, utilisez:

pgrep <process command>

J'utilise ensuite la commande kill pour tuer le PID retourné par pgrep <process command>

kill <PID>

Ces commandes peuvent-elles être combinées en une seule afin de tuer le PID ou les PID renvoyés par pgrep <process command>? Ou existe-t-il une méthode pour tuer plusieurs processus par nom de commande?

Quelque chose comme : kill(pgrep <name of process>)

ciel bleu
la source
3
As-tu essayé pkill? Vous pouvez également utiliser xargs.
MatthewRock
1
Notez que les pages de manuel sont également utiles pour des choses comme celle-ci. Souvent, ils vous indiquent non seulement comment utiliser la commande, mais également des commandes connexes. Dans ce cas, la pgreppage de manuel mentionne pkillpartout (car les 2 commandes proviennent du même package).
Patrick

Réponses:

27

Vous pouvez utiliser pkill:

pkill httpd

Vous pouvez également utiliser la substitution de processus (bien que ce ne soit pas aussi clair):

kill $(pgrep command)

Et vous voudrez peut-être utiliser xargs:

pgrep command | xargs kill
MatthewRock
la source
4
J'ai fait une chose similaire dans une réponse et on m'a fait remarquer que j'avais introduit une condition de course. Les ID de processus peuvent être invalidés entre les appels vers pgrepet kill. Utilisez simplement pkill.
Kusalananda
3
@Kusalananda, la même chose peut également se produire entre l' pkillobtention de la liste de processus et l'envoi du signal, c'est juste plus difficile à voir dans ce cas.
hobbs
1
J'allais essayer de composer une réponse qui bouclait quelque chose comme kill $(ps|head -1)pour éviter la condition de course ... mais il n'y a vraiment pas de moyen de l'éviter. Le processus pourrait mourir à tout moment dans le pipeline.
Ross Presser
Soyez juste prudent avec pkill car certains programmes peuvent avoir plus d'une instance en cours d'exécution et vous ne voudrez peut-être pas tous les tuer. L'exécution de pgrep en premier sera utile tant qu'un autre ne démarre pas entre le moment où vous exécutez pgrep et pkill (race).
Joe
1
Même un programme C ne peut pas éviter la condition de concurrence, la fenêtre sera juste plus petite. La seule façon de le faire de manière atomique serait d'ajouter un appel système qui tue les processus par leur nom. Mais les ID de processus ne seront généralement pas réutilisés très rapidement, de sorte que le danger est pratiquement inexistant.
Barmar
17

Vous pouvez également utiliser killall, par exemple

killall firefox

à envoyer SIGTERMà tous les firefoxprocessus.

Byte Commander
la source
8
Notez que cela killalla des significations différentes sur différents systèmes Unix - si vous êtes sur un système non Linux, assurez-vous de vérifier la documentation.
Random832
killall -KILL firefoxpeut être tellement gratifiant.
pipe
La non-portabilité de killallc'est pourquoi je ne l'utilise jamais. Par exemple, courir killallsur un boîtier Solaris est désastreux.
Patrick
9

Oui, vous pouvez utiliser une fonction bash et boucler sur la sortie.

$ for proc in $(pgrep <process command>); do kill $proc; done
lcipriani
la source
Je reçoiskill <no>:failed: operation not permitted
Timo
Vous n'avez probablement pas les bonnes autorisations ou le processus n'existe plus, veuillez vous référer à: superuser.com/questions/1175485/…
lcipriani
0

Vous pouvez tuer plusieurs processus avec array. Dans ce cas , vous pouvez spécifier les options comme $ip, $hostnameou quelque chose de similaire.

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
la source