Comment tuer tous les processus correspondant à un nom?

261

Disons que je veux tuer tous les processus contenant le mot amarok. Je peux imprimer les commandes que je veux exécuter. Mais comment faire pour que le shell les exécute. c'est à dire.

ps aux | grep -ie amarok | awk '{print "kill -9 " $2}'
Output:
kill -9 3052
kill -9 3071
kill -9 3076
kill -9 3077
kill -9 3079
kill -9 3080
kill -9 3082
kill -9 3083
kill -9 3084
kill -9 3085
kill -9 3086
kill -9 3087
kill -9 3088
kill -9 3089
kill -9 4031
PuercoPop
la source
Ajouter | sh -xaprès le reste de votre ligne de commande?
Jonathan Leffler
7
ne jamais utiliser kill -9sur un processus voir [gestion des processus] [1] [1]: mywiki.wooledge.org/… ...
Fredrik Pihl
Ajoutant au commentaire ci-dessus que non seulement le kill -9 est une mauvaise idée mais aussi le fait que vous essayez de tuer plusieurs processus via leur nom. Le nom d'un processus n'a rien d'unique et est donc un mauvais candidat pour l'identification.
Raul
Cela tuera-t-il amarokxaussi le processus? Je pkill vi, il tue supervisorctlqui contient «vi» dans le mot.
Gank
4
Cet article sur la non-utilisation -9est assez inutile - existe-t-il de meilleures informations sur les raisons pour lesquelles les gens ne devraient pas l'utiliser? Il dit simplement "ne faites pas, et renvoyez les gens qui l'utilisent"; mais tout ce que j'ai jamais vu ailleurs, c'est kill -9 {pid}comment tuer quelque chose ...
dwanderson

Réponses:

439

De man 1 pkill

-f     The pattern is normally only matched against the process name.
       When -f is set, the full command line is used.

Ce qui signifie, par exemple, si nous voyons ces lignes dans ps aux:

apache   24268  0.0  2.6 388152 27116 ?        S    Jun13   0:10 /usr/sbin/httpd
apache   24272  0.0  2.6 387944 27104 ?        S    Jun13   0:09 /usr/sbin/httpd
apache   24319  0.0  2.6 387884 27316 ?        S    Jun15   0:04 /usr/sbin/httpd

Nous pouvons tous les tuer en utilisant l' -foption pkill :

pkill -f httpd
Tim Bielawa
la source
1
Je me rends compte que cela n'aborde pas le sujet de cette question, mais cela démontre une méthode alternative et plus courte de faire ce que vous essayez de faire.
Tim Bielawa
19
Pour plus de force, ajoutez -9à la fin!
mlissner
Cela tuera-t-il httpdxaussi le processus? Je pkill vi, il tue supervisorctlqui contient «vi» dans le mot.
Gank
Génial - Ubuntu 18.04.1 LTS
Salathiel Genèse
Pour les correspondances insensibles à la casse, utilisez -i, comme pkill -fi wine. Pour vérifier avant et après, utilisez ps uax | grep -i wine.
vulcan raven
207
ps aux | grep -ie amarok | awk '{print $2}' | xargs kill -9 

xargs (1): xargs - construire une ou des listes d'arguments et exécuter l'utilitaire. Utile lorsque vous souhaitez diriger des arguments vers quelque chose comme killou lsou ainsi de suite.

Nektarios
la source
3
Points pour mentionner xargs - tous ces trucs pgrep / pkill sont tous très bien, mais xargs est un outil à usage général, et standard sur chaque linux / unix.
chrisdowney
4
"tuer: aucun processus de ce type"
Cerin
3
Cerin, c'est parce qu'il essaie également de tuer le processus grep, qui est déjà terminé. Ça devrait être bon.
Costi Muraru
6
Il y a une petite astuce pour éviter de capturer le processus grep: ps aux | grep -ie [a] marok | awk '{print $ 2}' | xargs kill -9
RCross
8
vous pouvez également ajouter un autre appel grep pour filtrer grep (je trouve cela plus facile à lire / à mémoriser) ps aux | grep -ie amarok | grep -v grep | awk '{print $2}' | xargs kill -9 ( grep -vsignifie grep --invert)
driftcatcher
47

utilisation pgrep

kill -9 $(pgrep amarok)
Eric Fortis
la source
26
encore plus élégant:pkill -9 amarok
glenn jackman
1
pkill gère la partie "chaque processus contenant le mot <word>" en mode natif sans créer plus de canaux ou de processus. Voir l'option -f pour une recherche complète des noms de processus afin d'éliminer le besoin de pgrep.
Tim Bielawa
2
Attention, pkill par défaut permet une correspondance partielle sur les noms de processus. Cette commande tuerait également amarok2 si elle existait. Utilisez -x ou -f si vous souhaitez spécifier des noms exacts.
user79878
Il échouera si ce n'est pas le cas pour pgrep
alfredocambera
pour une utilisation avec un nom completkill -9 $(pgrep -f amarok)
cinatic
27

Pour ce faire, le moyen le plus sûr est:

pkill -f amarok
John Alexander Betts
la source
1
Pour ajouter à cela, j'ai ajouté le -ldrapeau. En fait, j'ai juste un alias pkillpour pkill -flque je puisse exécuter quelque chose comme pkill jbosset cela crachera le processus qu'il vient de tuer.
nland
Cela tuera-t-il amarokxaussi le processus? Je pkill vi, il tue supervisorctlqui contient «vi» dans le mot.
Gank
En quoi est-ce différent de la réponse du haut (Tim)? Correspond juste au nom de l'exemple, sinon il est identique? @ndland pkill: invalid option -- 'l'- pkill de procps-ng 3.3.12
Xen2050
18

Je pense que cette commande killall est exactement ce dont vous avez besoin. La commande est décrite comme "tuer les processus par leur nom". Elle est facile à utiliser. Par exemple

killall chrome

Cette commande va tuer tous les processus de Chrome.Voici un lien sur la commande killall

http://linux.about.com/library/cmd/blcmdl1_killall.htm

J'espère que cette commande pourrait vous aider.

androidyue
la source
Cela correspond uniquement par nom, pas par ligne de commande complète. Certainement pas la même chose que ps auxla sortie de la recherche
Xen2050
12

pkill -x correspond exactement au nom du processus.

pkill -x amarok

pkill -f est similaire mais permet un modèle d'expression régulière.

Notez que pkill sans aucun autre paramètre (par exemple -x, -f) permettra des correspondances partielles sur les noms de processus. Donc "pkill amarok" tuerait amarok, amarokBanana, bananaamarok, etc.

Je souhaite que -x soit le comportement par défaut!

user79878
la source
Cela tuera-t-il amarokxaussi le processus? Je pkill vi, il tue supervisorctlqui contient «vi» dans le mot.
Gank
@Gank, oui, n'importe quel nom de processus avec "amarok" quelque part.
user79878
Comment tuer seulement amarok au lieu d'amarokx?
Gank
1
@ Gank, drapeau -x. pkill -x amarok
user79878
4

Si vous souhaitez exécuter la sortie d'une commande, vous pouvez la placer à l'intérieur $(...), mais pour votre tâche spécifique, jetez un œil aux commandes killallet pkill.

Chen Levy
la source
3

Vous pouvez également évaluer votre sortie en tant que sous-processus, en entourant le tout de tiques inversées ou en le mettant dans $ ():

`ps aux | grep -ie amarok | awk '{print "kill -9 " $2}'`

 $(ps aux | grep -ie amarok | awk '{print "kill -9 " $2}')     
dandrews
la source
3

try kill -s 9ps -ef |grep "Nov 11" |grep -v grep | awk '{print $2}' Pour tuer les processus du 11 novembre ou kill -s 9 ps -ef |grep amarok|grep -v grep | awk '{print $2}' Pour tuer les processus qui contiennent le mot amarok

Victor Marrerp
la source
0

Peut-être ajouter les commandes au fichier exécutable, définir l'autorisation + x puis exécuter?

ps aux | grep -ie amarok | awk '{print "kill -9 " $2}' > pk;chmod +x pk;./pk;rm pk
vova7865
la source
-1

Si vous utilisez cygwin ou un shell minimal qui manque, killallvous pouvez simplement utiliser ce script:

killall.sh - Tuer par nom de processus.

#/bin/bash
ps -W | grep "$1" | awk '{print $1}' | xargs kill --

Usage:

$ killall <process name>
Tony O'Hagan
la source
Je reçoiskill: invalid argument f
rosstex
1
Essayez de remplacer -f par -
Tony O'Hagan