Je veux tuer tous les processus que j'obtiens:
ps aux | grep my_pattern
Comment faire?
Cela ne fonctionne pas:
pkill my_pattern
Je veux tuer tous les processus que j'obtiens:
ps aux | grep my_pattern
Comment faire?
Cela ne fonctionne pas:
pkill my_pattern
Réponses:
Utiliser pkill -f
, qui correspond au modèle pour n'importe quelle partie de la ligne de commande
pkill -f my_pattern
pkill
- l'erreur la plus courante étant l'hypothèse qu'une seule instance de chaque binaire pourrait exister à un moment donné.
killall -m my_pattern
.
pgrep
abord pour vérifier ce que vous allez tuer. Vous pouvez utiliser pgrep -l
pour voir les noms de processus ou pgrep -a
pour 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
.
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
Que fait ce code?
Le ps -ef
produit 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 grep
dit 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.
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 kill
pièce par un indicateur transmis qui demande un arrêt progressif, et uniquement si cette demande est refusée, en dernier recours pourkill -9
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 -ef
ré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.
ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9
pour que xargs n'exécute pas la commande si aucun argument n'est donné.
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.
-r
L'option n'existe pas sur OS X, il semble donc.
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.
kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`
(notez aussi le refactoring; voir aussi mon commentaire sur la réponse de @ synthesizerpatel).
ps
renvoie trois processus 123, 234 et 345, vous pouvez kill 123 234 345
comme vous le pouvez rm
ou cat
plusieurs arguments de fichier.
grep
for KILLPID in
ps ax | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; done
supprimera le grep
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 }')
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
-r
ou --regexp
, qui sont respectivement les options short et GNU long.
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.
Semble mauvais?
pkill `pidof myprocess`
exemple:
# kill all java processes
pkill `pidof java`
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.
il est préférable et plus sûr de l'utiliser pgrep -f
avec kill
, ou tout simplement pkill -f
, la sortie de grep
ing ps
peut mal tourner.
Contrairement à l'utilisation ps | grep
avec laquelle vous devez filtrer la ligne grep en ajoutant | grep -v
ou en utilisant des astuces de modèle, pgrep
ne se choisira tout simplement pas par conception.
De plus, si votre modèle apparaît dans ps
's UID
/ USER
, SDATE
/ START
ou 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$"
J'ai pris la réponse d'Eugen Rieck et j'ai travaillé avec. Mon code ajoute ce qui suit:
ps ax
inclut grep, donc je l'ai exclu avec grep -Eiv 'grep'
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
my_pattern
simplement une sous-chaîne du nom, ou contient-elle des caractères spéciaux regex?