Comment tuer tous les processus avec un prénom?

16

J'exécute la commande ps -A | grep <application_name>et j'obtiens la liste des processus comme ceci:

19440 ?        00:00:11 <application_name>
21630 ?        00:00:00 <application_name>
22694 ?        00:00:00 <application_name>

Je veux tuer tous les processus de la liste: 19440, 21630, 22694.

J'ai essayé ps -A | grep <application_name> | xargs kill -9 $1mais cela fonctionne avec des erreurs.

kill: illegal pid ?
kill: illegal pid 00:00:00
kill: illegal pid <application_name>

Comment puis-je le faire gracieusement?

Łukasz D. Tulikowski
la source

Réponses:

25
pkill -f <application_na>

Tue tous les processus qui contiennent le motif <application_na>dans leurs noms.

homme pkill

Katu
la source
9

Le problème est que ps -A | grep <application_name> | xargs -n1renvoie une sortie comme celle-ci

19440
?
00:00:11
<application_name>
21630
?
00:00:00
<application_name>
22694
?
00:00:00
<application_name>

Vous pouvez utiliser awkpour obtenir d'abord une colonne de pssortie .

ps -A | grep <application_name> | awk '{print $1}' | xargs -n1

Renvoie la liste des PID

19440
21630
22694

Et en ajoutant que kill -9 $1vous avez une commande qui tue tous les PID

ps -A | grep <application_name> | awk '{print $1}' | xargs kill -9 $1
Łukasz D. Tulikowski
la source
c'est le test parfait je l'ai sur le script bash il est tue le processer sans erreur immediat + même si le is'nt processus a commencé il montre aucune erreur qui est ce que je veux, ici exemple de tueur ffmpeg processer, nano /usr/bin/ffmpegk . . . . ps -A | grep ffmpeg | awk '{print $1}' | xargs kill -9 $1 . . . . chmod a+rx /usr/bin/ffmpegk
Salem F
J'ai un problème avec cela où j'obtiens la sortie de kill -9si aucun processus ne correspond
Daniel F
1
Au lieu de la grep, vous devriez utiliser awkpour faire correspondre le nom:ps -A | awk "\$4 == \"$1\" { print \$1; }"
Toby Speight
0

killall peut faire ça.

$ killall application_name
rudimeier
la source
Est-ce que kill all autorise l'expression régulière dans un nom d'application?
Łukasz D. Tulikowski
killall --regexp "appl.*me"Bien qu'il puisse y avoir différentes implémentations killall. Tu vois man killall.
rudimeier
killall pas assez parfois j'ai besoin de l'envoyer trois fois pour tuer le processus, et même de ne pas le tuer, la seule solution de travail rapide pour moi est kill -9 pidje pense @ ŁukaszD.Tulikowski est la meilleure solution de travail spécialement pour les scripts bash.
Salem F
-1
ps -eaf | grep -i applicationname| grep -iv 'grep'| awk '{print "kill -9" " "  $2}'|sh
Praveen Kumar BS
la source
Bien que je n'aie pas encore voté sur cette question, vous n'avez pas expliqué pourquoi elle est différente ou meilleure que les autres solutions - qui sont très similaires à celle-ci - ni expliqué pourquoi le PO a eu des problèmes avec leur variation.
Jeff Schaller
-2

Mon approche est similaire à celle de @ Łukasz D. Tulikowski. Au lieu d'utiliser grep <application_name>; J'ai utilisé grep "[a]pplication_name", qui ne correspond pas à sa propre ligne de commande de processus.

L'expression entre crochets fait partie de la grepcorrespondance de modèle de classe de caractères du. (Référence) .


Vous pouvez utiliser awkpour obtenir d'abord une colonne de pssortie.

ps -A | grep "[a]pplication_na" | awk '{print $2}' | xargs -n1

Renvoie la liste des PID

7644
407
406

Plus tard, kill -9 $1vous ajoutez une commande qui tue tous les PID

ps aux | grep "[a]pplication_na" | awk '{print $2}' | xargs kill -9 $1
alper
la source
Pourquoi au greplieu d'utiliser awkpour faire le test plus correctement? grepfera correspondre les noms qui incluent la cible comme sous-chaîne, par exemple.
Toby Speight