Supposons que j'ai un millier d'instances ou plus d'un processus (par exemple vi
) en cours d'exécution. Comment puis-je tous les tuer en un seul coup / une seule ligne / une seule commande?
Supposons que j'ai un millier d'instances ou plus d'un processus (par exemple vi
) en cours d'exécution. Comment puis-je tous les tuer en un seul coup / une seule ligne / une seule commande?
Réponses:
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 y a moyen de rendre cela plus efficace,
for pid in $(ps -ef | awk '/some search/ {print $2}'); do kill -9 $pid; done
et d'autres variations, mais au niveau de base, cela a toujours fonctionné pour moi.
echo kill -9 $pid
toute façon, je le lance toujours comme une première pour que je sache ce que je reçois. Je ne suis pas sûr qu'AIX en ait pkill
, qui est mon pain et beurre UNIX. Et est-ce vraiment assez grave d'être voté à la baisse - étrange.
csh
Utilisez killall,
killall vi
Cela va tuer toutes les commandes nommées 'vi'
Vous pouvez également ajouter un signal, par exemple SIGKILL
killall -9 vi
killall -9 vi
killall
fait exactement ce que son nom l'indique ... tue le processus init.
pkill
C’est ce que je recommande, s’il est disponible ( Linux , FreeBSD , NetBSD , OpenBSD , Solaris ). Vous pouvez spécifier des processus à l'aide du nom de la commande, de la ligne de commande complète ou d'autres critères. Par exemple, pkill vi
supprime tous les programmes dont le nom de commande contient la sous-chaîne vi
. Pour ne tuer que les processus appelés vi
, utilisez pkill -x vi
. Pour ne tuer que 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
envoyer un signal, utilisez pgrep
, qui a exactement la même syntaxe, à la différence près qu'il n'accepte pas le nom ou le numéro du signal. Pour plus d'informations sur ces processus, exécutez
ps -p "$(pgrep …)"
Sous Linux, vous avez ps -p $(pgrep -d, …)
plutôt besoin (c'est un bogue: celui de Linux ps
n'est pas compatible POSIX).
Un autre moyen courant d'identifier les processus à éliminer est les processus qui ont un fichier ouvert (qui peut être l'exécutable du processus). Vous pouvez les lister avec fuser
; utiliser fuser -k
pour leur envoyer un signal. Par exemple, fuser -k /usr/bin/find
tue tous les éléments en cours d'exécution de find
.
Si un processus incontrôlé continue à falsifier, vous devrez peut-être supprimer tout le groupe de processus en même temps. Un groupe de processus est identifié par le négatif de son chef, qui est le processus ancêtre de tous les processus du groupe. Pour voir le groupe de processus auquel appartient un processus, exécutez-le ps -o pgid
(plus toute option permettant de sélectionner le ou les processus à afficher). Si vous déterminez que vous voulez tuer le chef de groupe de processus 1234 et tous ses enfants, courir kill -1234
ou kill -HUP -1234
ou tout autre signal.
Si vous ne trouvez pas de meilleur moyen, utilisez la commande ps
avec les options appropriées pour répertorier tous les processus et les filtrer avec grep
ou une autre commande de filtrage de texte. Veillez à ne pas faire correspondre accidentellement d'autres processus exécutant une commande portant 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 ps
sortie ( ps
et que la commande de filtrage est démarrée en parallèle, son affichage dépend du moment choisi). Ceci est particulièrement important si les arguments de commande sont inclus dans la ps
sortie.
pkill
c'est très bien ici. Vous pouvez lui donner beaucoup de paramètres pour affiner le motif.
pkill
est disponible sous Linux, BSD et Solaris. Donc, il a une plus grande propagation que killall
.
La meilleure façon de le faire est d’abord de vérifier 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]
pgrep -f "command name"
Intéressant personne n'a mentionné celui-ci. pidof génère des pids de processus séparés par des espaces correspondant au nom de processus transmis. En tant que tel, vous pouvez directement utiliser 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.
Je vous suggère d'essayer pkill
.
Ex: ps -ef | pkill -f command
Pour afficher la liste de tous les processus à tuer en premier, essayez de pgrep
:
Ex: ps -ef | pgrep -f command
ps -ef
dans pkill
ou pgrep
? Ces commandes ne lisent pas depuis l'entrée standard.
$ ps -eaf | grep "xyz" | grep -v grep | awk 'print $2' | xargs kill
ps -ef | pgrep -f "search" | xargs kill -9
pkill
duprocps
package.