Je veux tuer tous les processus que je réussis:
ps aux | grep my_pattern
Comment faire?
Cela ne fonctionne pas:
pkill my_pattern
Utilisez pkill -f
, qui correspond au motif pour toute partie de la ligne de commande.
pkill -f 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'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.
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
.
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?.
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.
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 }')
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
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.
Vous pouvez utiliser la commande suivante pour
kill -9 $(ps aux | grep 'process' | grep -v 'grep' | awk '{print $2}')
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
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`
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.
il est préférable et sûr d'utiliser _pgrep -f
_ avec kill
ou simplement _pkill -f
_, grep
ing 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$"
_