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

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

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.


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)

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

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.


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!


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.


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}')     

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


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

-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>

Je reçoiskill: invalid argument f
rosstex

1
Essayez de remplacer -f par -
Tony O'Hagan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.