@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":
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.
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
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.
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
-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
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.
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.
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.
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
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.
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.
my_pattern
simplement une sous-chaîne du nom, ou contient-elle des caractères spéciaux regex?Réponses:
Utiliser
pkill -f
, qui correspond au modèle pour n'importe quelle partie de la ligne de commandela source
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 utiliserpgrep -l
pour voir les noms de processus oupgrep -a
pour voir les lignes de commande complètes. Il utilise les mêmes drapeaux que pkill. Donc, dans ce cas, vous pouvez utiliserpgrep -fa my_pattern
.Tuez tous les processus correspondant à la chaîne "myProcessName":
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'ID de processus sur l'ordinateur visible par cet utilisateur. Le canal grep filtre cela pour les lignes contenant cette chaîne. Legrep -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.
la source
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
Vous pouvez utiliser grep -e etc.
la source
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 pouvezkill 123 234 345
comme vous le pouvezrm
oucat
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 grepvous pouvez utiliser la commande suivante pour répertorier le processus
si vous devez vérifier le nombre de ce processus, puis exécutez
après quoi vous pouvez tuer le processus en utilisant
la source
Vous pouvez également utiliser
killall -r my_pattern
.-r
Interpréter le modèle de nom de processus comme une expression régulière étendue.la source
Si vous jugez
pkill -f PATTERN
un 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.la source
Vous pouvez utiliser la commande suivante pour
la source
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
la source
-r
ou--regexp
, qui sont respectivement les options short et GNU long.Vous pouvez utiliser la commande suivante pour:
ou
Ça marche pour moi.
la source
Semble mauvais?
exemple:
la source
Trouvé la meilleure façon de le faire pour un serveur qui ne prend pas en charge
pkill
Vous n'avez pas à boucler.
la source
il est préférable et plus sûr de l'utiliser
pgrep -f
aveckill
, ou tout simplementpkill -f
, la sortie degrep
ingps
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
'sUID
/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$"
man pkill
la source
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 avecgrep -Eiv 'grep'
J'ai créé un fichier, je l'ai nommé
killserver
, ça y va:Résultats
la source
Ceci est le chemin:
la source