web-dev-qa-db-fra.com

Tuez de nombreuses instances d'un processus en cours d'exécution avec une seule commande

Supposons que j'ai au moins mille instances de n'importe quel processus (par exemple, vi) en cours d'exécution. Comment puis-je tous les tuer en une seule fois/une seule ligne de commande/une seule commande?

80
The Dark Knight

Quel est le problème avec le bon vieux,

for pid in $(ps -ef | grep "some search" | awk '{print $2}'); do kill -9 $pid; done

Il existe des moyens de rendre cela plus efficace,

for pid in $(ps -ef | awk '/some search/ {print $2}'); do kill -9 $pid; done

et d'autres variantes, mais au niveau de base, cela a toujours fonctionné pour moi.

105
EightBitTony

Utilisez killall,

killall vi

Cela tuera toutes les commandes nommées "vi"

Vous pouvez également ajouter un signal, par exemple SIGKILL

killall -9 vi

39
daisy

pkill est ce que je recommande, s'il est disponible ( Linux , FreeBSD , NetBSD , OpenBSD , Solaris ). Vous pouvez spécifier des processus par le nom de la commande, par la ligne de commande complète ou d'autres critères. Par exemple, pkill vi Tue tous les programmes dont le nom de commande contient la sous-chaîne vi. Pour tuer uniquement les processus appelés vi, utilisez pkill -x vi. Pour tuer uniquement les processus appelés vi avec un dernier argument se terminant par .conf, Utilisez pkill -fx 'vi.*\.conf'.

Pour voir la liste des PID auxquels pkill enverrait un signal, utilisez pgrep, qui a exactement la même syntaxe, sauf qu'il n'accepte pas de nom ou de numéro de signal. Pour voir plus d'informations sur ces processus, exécutez

ps -p "$(pgrep …)"

Sous Linux, vous avez plutôt besoin de ps -p $(pgrep -d, …) (c'est un bug: le ps de Linux n'est pas compatible POSIX).

Une autre manière courante d'identifier les processus à tuer est les processus qui ont un certain fichier ouvert (qui peut être l'exécutable du processus). Vous pouvez les lister avec fuser ; utilisez fuser -k pour leur envoyer un signal. Par exemple, fuser -k /usr/bin/find Tue toutes les isntances en cours d'exécution de find.

S'il y a un processus incontrôlable qui continue de bifurquer, vous devrez peut-être tuer l'ensemble groupe de processus à la fois. Un groupe de processus est identifié par le négatif de son leader, qui est le processus ancêtre de tous les processus du groupe. Pour voir le groupe de processus auquel appartient un processus, exécutez ps -o pgid (Plus toute option pour sélectionner le ou les processus à afficher). Si vous déterminez que vous souhaitez tuer le chef de groupe de processus 1234 et tous ses enfants, exécutez kill -1234 Ou kill -HUP -1234 Ou tout autre signal.

Si vous ne trouvez pas de meilleur moyen, utilisez ps avec les options appropriées pour répertorier tous les processus et filtrez-le avec grep ou une autre commande de filtrage de texte. Veillez à ne pas faire correspondre accidentellement d'autres processus qui exécutent une commande avec un nom similaire ou avec un argument contenant ce nom. Par exemple:

kill $(ps -o pid -o comm | awk '$2 == "vi" {print $1}')

N'oubliez pas que votre commande grep ou awk elle-même peut être répertoriée dans la sortie ps (ps et la commande de filtrage sont démarrées en parallèle, donc si apparaître ou non dépend du timing). Ceci est particulièrement important si les arguments de commande sont inclus dans la sortie ps.

La façon la plus simple de procéder consiste à vérifier d'abord que vous obtenez les bons ID de processus avec:

pgrep -f [part_of_a_command]

Si le résultat est comme prévu. Aller avec:

pkill -f [part_of_a_command]
7
Tahsin Turkoz

pkill est très sympa ici. Vous pouvez lui donner beaucoup de paramètres pour affiner le motif.

7
Nils

Intéressant, personne n'a mentionné celui-ci. pidof affiche des pids séparés par des espaces des processus correspondant au nom de processus transmis. En tant que tel, vous pouvez utiliser directement sa sortie avec kill sans tuyauterie. Sur Arch Linux j'utilise

kill -9 $(pidof <proc name>)

L'inconvénient de cette solution est qu'elle ne permet pas l'utilisation d'expressions régulières.

3
sherrellbc

Je vous suggère d'essayer pkill.

Ex: ps -ef | pkill -f command

Pour afficher la liste de tous les processus à tuer, essayez d'abord de pgrep:

Ex: ps -ef | pgrep -f command

1
Ankit Vashistha

Vous pouvez tuer plusieurs processus différents en utilisant la commande ci-dessous

pkill -9 -f "\.\/.+\s\.|process1|process2|process3\[^"

Notez que cela tuera le processus qui correspond au modèle ci-dessus, signifie process1abcprocess2defprocess3ghi sera également tué.

0
SandPox

pgrep "name-of-application" | xargs kill -9

Était assez simple à retenir et fonctionnait bien pour moi.

0
Horv