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


623

Je veux tuer tous les processus que j'obtiens:

ps aux | grep my_pattern

Comment faire?

Cela ne fonctionne pas:

pkill my_pattern

11
Est-ce my_patternsimplement une sous-chaîne du nom, ou contient-elle des caractères spéciaux regex?
Sven Marnach

Réponses:


1318

Utiliser pkill -f, qui correspond au modèle pour n'importe quelle partie de la ligne de commande

pkill -f my_pattern

7
@Jayan: il est également assez aveugle dans son meurtre. Il est étonnamment facile de mal
gérer

1
@Jayan: tu ne vas pas me convaincre :-). J'ai été trop souvent brûlé par des scripts tiers qui insistaient pour utiliser pkill- l'erreur la plus courante étant l'hypothèse qu'une seule instance de chaque binaire pourrait exister à un moment donné.
thkala le

4
Pour tous les utilisateurs de Mac qui trouvent cette réponse, comme moi, l'équivalent Mac est killall -m my_pattern.
Zev Eisenberg

1
Si vous avez un certain nombre de processus suspendus qui ne sont pas tués, utilisez pkill -f -9 pour les tuer sans pitié
MacK

18
Je recommande d'utiliser d' pgrepabord pour vérifier ce que vous allez tuer. Vous pouvez utiliser pgrep -lpour voir les noms de processus ou pgrep -apour voir les lignes de commande complètes. Il utilise les mêmes drapeaux que pkill. Donc, dans ce cas, vous pouvez utiliser pgrep -fa my_pattern.
studgeek

158

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 -efproduit une liste d'ID de processus sur l'ordinateur visible par cet utilisateur. Le canal grep filtre cela pour les lignes contenant cette chaîne. Le grep -v grepdit ne correspond pas au processus lui-même qui fait le salut. L'impression awk du tuyau dit de diviser les lignes sur les espaces blancs du délimiteur par défaut et de filtrer sur la deuxième colonne qui est notre identifiant de processus. Le pipe xargs lance un nouveau processus pour envoyer tous ces pid à kill -9, les terminant tous.

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

  1. Si le code forcé effectue des opérations de base de données ou des transactions sécurisées avec des conditions de concurrence à faible probabilité, une fraction d'un pour cent du temps, l'atomicité de cette transaction sera détruite, produisant un comportement indéfini. tuer -9 ne fait aucun prisonnier. Si votre code est sensible à cela, essayez de remplacer la xargs killpièce par un indicateur transmis qui demande un arrêt progressif, et uniquement si cette demande est refusée, en dernier recours pourkill -9

  2. Il y a une possibilité non nulle que vous arrêtiez accidentellement le système d'exploitation ou provoquiez un comportement indéfini dans un processus non lié, conduisant à une instabilité du système entier car ps -efrépertorie tous les processus possibles qui pourraient exister, et vous ne pouvez pas être sûr qu'une bibliothèque tierce étrange partage votre nom du processus, ou que dans l'intervalle entre lire et exécuter kill -9, l'ID de processus avait changé pour quelque chose d'autre, 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 contrôlez-les avec des noms très uniques, et que vous êtes d'accord avec quelques transactions abandonnées ou une corruption occasionnelle des données, alors 99,9% du temps, tout ira bien. En cas de problème, redémarrez l'ordinateur, assurez-vous qu'il n'y a pas de collision de processus. C'est à cause d'un code comme celui-ci qui fait du script de support technique: "Avez-vous essayé de redémarrer votre ordinateur" un mème de niveau 5.


15
Cela générera une erreur si aucun processus correspondant au nom n'est trouvé. Vous voudrez peut-être utiliser ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9pour que xargs n'exécute pas la commande si aucun argument n'est donné.
Epigene

2
Juste une légère modification, il est peut-être préférable de citer le nom du processus: ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9 sans guillemets, un seul de mes processus d'arrière-plan a été tué lors de la première exécution. L'exécuter à nouveau a tué les autres.
Ali Haider

-rL'option n'existe pas sur OS X, il semble donc.
Danijel

52

Si vous avez besoin de plus de flexibilité pour sélectionner les processus, utilisez

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

Vous pouvez utiliser grep -e etc.


4
-1 Vous n'avez pas besoin d'une boucle, vous pouvez juste kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`(notez aussi le refactoring; voir aussi mon commentaire sur la réponse de @ synthesizerpatel).
tripleee

11
@tripleee Pas de problème avec votre downvote, mais vous vous rendez compte que l'OQ était "Je veux tuer tous les processus que j'obtiens: ps aux | grep my_pattern" , ce que j'ai accepté avec dévouement.
Eugen Rieck

Kill tuera tous les processus en une seule fois, vous n'avez pas besoin d'une boucle pour cela. Si le psrenvoie trois processus 123, 234 et 345, vous pouvez kill 123 234 345comme vous le pouvez rmou catplusieurs arguments de fichier.
tripleee

@tripleee I ment supprimant legrep
Eugen Rieck

for KILLPID in ps ax | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; donesupprimera le grep
Justin E

18

vous pouvez utiliser la commande suivante pour répertorier le processus

ps aux | grep -c myProcessName 

si vous devez vérifier le nombre de ce processus, puis exécutez

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 }') 

vous pouvez utiliser la commande suivante pour lister le processus ps aux | grep -c myProcessName si vous devez vérifier le nombre de ce processus, puis exécutez 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}')
Nived Thanima

13

Vous pouvez également utiliser killall -r my_pattern. -rInterpréter le modèle de nom de processus comme une expression régulière étendue.

killall -r my_pattern

8

Si vous jugez pkill -f PATTERNun peu trop dangereux, j'ai écrit à ezkill un script bash qui vous invite à choisir les processus parmi ceux qui correspondent au MOTIF que vous voulez tuer.


7

Vous pouvez utiliser la commande suivante pour

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

4

Si vous ne voulez pas prendre la tête de trouver l'ID de processus, utilisez regexp pour tuer le processus par son nom. Par exemple, pour tuer Chrome, le code suivant fera l'affaire.

killall -r --regexp chrome


1
Vous n'avez besoin que de -r ou --regexp , qui sont respectivement les options short et GNU long.
BigSmoke

3

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.


1
Bienvenue dans StackOverflow. Veuillez utiliser une indentation à 4 espaces ou des tabulations pour vos lignes de code afin qu'elles soient formatées en blocs de code. Cordialement
YakovL

2

Semble mauvais?

 pkill `pidof myprocess`

exemple:

# kill all java processes
pkill `pidof java`

2

Trouvé la meilleure façon de le faire pour un serveur qui ne prend pas en charge pkill

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

Vous n'avez pas à boucler.


1

il est préférable et plus sûr de l'utiliser pgrep -favec kill, ou tout simplement pkill -f, la sortie de greping pspeut mal tourner.

Contrairement à l'utilisation ps | grepavec laquelle vous devez filtrer la ligne grep en ajoutant | grep -vou en utilisant des astuces de modèle, pgrepne se choisira tout simplement pas par conception.

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

J'ai aussi constaté que killall -r/ -regexp ne fonctionnait pas avec mon expression régulière.

pkill -f "^python3 path/to/my_script$"

man pkill


0

J'ai pris la réponse d'Eugen Rieck et j'ai travaillé avec. Mon code ajoute ce qui suit:

  1. ps ax inclut grep, donc je l'ai exclu avec grep -Eiv 'grep'
  2. Ajout de quelques ifs et échos pour le rendre lisible par l'homme.

J'ai créé un fichier, je l'ai nommé killserver, ça y va:

#!/bin/bash
PROCESS_TO_KILL=bin/node
PROCESS_LIST=`ps ax | grep -Ei ${PROCESS_TO_KILL} | grep -Eiv 'grep' | awk ' { print $1;}'`
KILLED=
for KILLPID in $PROCESS_LIST; do
  if [ ! -z $KILLPID ];then
    kill -9 $KILLPID
    echo "Killed PID ${KILLPID}"
    KILLED=yes
  fi
done

if [ -z $KILLED ];then
    echo "Didn't kill anything"
fi

Résultats

  myapp git:(master) bash killserver
Killed PID 3358
Killed PID 3382
Killed
  myapp git:(master) bash killserver
Didn't kill anything

0

Ceci est le chemin:

kill -9 $(pgrep -d' ' -f chrome)

3
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant la manière et / ou la raison pour laquelle il résout le problème améliorerait la valeur à long terme de la réponse.
Igor F.19
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.