web-dev-qa-db-fra.com

Comment tuer tous les processus avec un nom partiel donné?

Je veux tuer tous les processus que je réussis:

ps aux | grep my_pattern

Comment faire?

Cela ne fonctionne pas:

pkill my_pattern
537
Łukasz Lew

Utilisez pkill -f, qui correspond au motif pour toute partie de la ligne de commande.

pkill -f my_pattern
1169
Dor Shemer

Tuez tous les processus correspondant à la chaîne "myProcessName":

ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9

Source: http://www.commandlinefu.com/commands/view/1138/ps-ef-grep-process-grep-v-grep-awk-print-2-xargs-kill-9

Que fait ce code?

Le ps -ef produit une liste d'identifiants de processus visibles sur l'ordinateur par cet utilisateur. Le tuyau grep filtre cela pour les lignes contenant cette chaîne. Le grep -v grep dit ne correspond pas au processus lui-même faisant le grepping. L'impression pipe awk indique de scinder les lignes sur les espaces de délimiteur par défaut et de filtrer la deuxième colonne, qui est notre identificateur de processus. Le tube xargs lance un nouveau processus pour envoyer tous ces pid à kill -9, en les terminant tous.

Le code ci-dessus est mauvais, dangereux, laid et hackish pour plusieurs raisons.

  1. Si le code en cours de suppression forcée exécute des opérations de base de données ou des transactions sécurisées avec des conditions de concurrence peu probables, dans une fraction de pourcentage du temps, l'atomicité de cette transaction sera détruite, produisant un comportement indéfini. kill -9 ne fait pas de prisonniers. Si votre code y est sensible, essayez de remplacer la partie xargs kill par un indicateur transmis qui demande un arrêt normal, et uniquement si cette demande est refusée, utilisez en dernier recours kill -9.

  2. Il existe une possibilité non nulle que vous mettiez fin au système d'exploitation par inadvertance ou que vous causiez un comportement non défini dans un processus indépendant, entraînant une instabilité totale du système, car ps -ef répertorie tous les processus possibles pouvant exister, et vous ne pouvez en être sûr. Une bibliothèque tierce partage le nom de votre processus ou, dans le temps écoulé entre la lecture et l'exécution de kill -9, l'identificateur de processus a été remplacé par autre chose et maintenant vous avez accidentellement mis fin à un processus aléatoire que vous n'aviez pas l'intention de faire.

Mais, si vous comprenez les risques et les maîtrisez avec des noms très uniques, et que vous êtes d'accord avec quelques transactions abandonnées ou une corruption occasionnelle dans les données, alors 99,9% du temps, ça va aller. En cas de problème, redémarrez l'ordinateur et assurez-vous qu'il n'y a pas de collisions de processus. C'est à cause d'un code comme celui-ci que le script de support technique: "Avez-vous essayé de redémarrer votre ordinateur" devient-il de niveau 5?.

129
Eric Leschinski

Si vous avez besoin de plus de flexibilité dans la sélection des processus utilisés

for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do 
  kill -9 $KILLPID;
done

Vous pouvez utiliser grep -e etc.

51
Eugen Rieck

vous pouvez utiliser la commande suivante pour lister le processus

ps aux | grep -c myProcessName 

si vous devez vérifier le nombre de processus, lancez

ps aux | grep -c myProcessName |grep -v grep 

après quoi vous pouvez tuer le processus en utilisant

kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }') 
17
Nived Thanima

Vous pouvez aussi utiliser killall -r my_pattern. -r Interprète le motif de nom de processus comme une expression régulière étendue.

killall -r my_pattern
12
Alex

Si vous jugez que pkill -f PATTERN est un peu trop dangereux, j’ai écrit ezkill un script bash vous invitant à choisir les processus qui correspondent au modèle que vous souhaitez supprimer.

8
kraymer

Vous pouvez utiliser la commande suivante pour

kill -9 $(ps aux | grep 'process' | grep -v 'grep' | awk '{print $2}')
6
Alex Liu

Si vous ne voulez pas avoir mal à la recherche d'un identifiant de processus, utilisez regex pour tuer le processus par son nom. Par exemple, tuer chrome le code suivant fera l'affaire.

killall -r --regexp chrome

4
ajaz

Vous pouvez utiliser la commande suivante pour:

ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9

ou

ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9

Ça marche pour moi.

3
Luis Lopes

Semble mauvais?

 pkill `pidof myprocess`

exemple:

# kill all Java processes
pkill `pidof Java`
2
user6482587

Trouver le meilleur moyen de le faire pour un serveur qui ne supporte pas 'pkill'

"kill -9 $ (ps ax | grep Mon_pattern | fgrep -v grep | awk '{print $ 1}')"

Vous n'êtes pas obligé de faire une boucle.

1
Magige Daniel

il est préférable et sûr d'utiliser _pgrep -f_ avec kill ou simplement _pkill -f_, greping ps. La sortie peut être erronée.

Contrairement à l'utilisation de _ps | grep_ avec laquelle vous devez filtrer la ligne grep en ajoutant _| grep -v_ ou en utilisant des astuces de motif, pgrep ne se choisira pas tout seul.

De plus, si votre modèle apparaît dans ps's UID/USER, SDATE/START ou toute autre colonne, vous obtiendrez des processus indésirables dans la sortie et les tuerez, pgrep + pkill ne souffrez pas de cette faille.

aussi j'ai trouvé que _killall -r_ / _-regexp_ ne fonctionnait pas avec mon expression régulière.

_pkill -f "^python3 path/to/my_script$"_

man pkill

1
Wis