Comment puis-je tuer un processus par son nom au lieu de PID?


349

Parfois, lorsque j'essaie de démarrer Firefox, il est dit "un processus Firefox est déjà en cours d'exécution". Je dois donc faire ceci:

jeremy@jeremy-desktop:~$ ps aux | grep firefox
jeremy    7451 25.0 27.4 170536 65680 ?        Sl   22:39   1:18 /usr/lib/firefox-3.0.1/firefox
jeremy    7578  0.0  0.3   3004   768 pts/0    S+   22:44   0:00 grep firefox
jeremy@jeremy-desktop:~$ kill 7451

Ce que j'aimerais, c'est une commande qui ferait tout ça pour moi. Cela prendrait une chaîne d'entrée et greppour cela (ou autre) dans la liste des processus, et tuerait tous les processus dans la sortie:

jeremy@jeremy-desktop:~$ killbyname firefox

J'ai essayé de le faire en PHP mais exec('ps aux')semble ne montrer que les processus qui ont été exécutés avec exec()dans le script PHP lui-même (donc le seul processus qu'il montre est lui-même.)


Lorsque j'obtiens la fenêtre qui dit que Firefox fonctionne déjà, je n'ai généralement qu'à attendre une seconde et je peux réexécuter Firefox (bien sûr, ce n'est pas toujours le cas).
nuoritoveri

1
C'est le moyen le plus sûr comme JohnB le dit dans cette réponse: stackoverflow.com/questions/6381229/…
tecnoshopbq


C'est une vieille question, mais pourriez-vous s'il vous plaît changer la réponse acceptée? Celui que vous avez marqué échoue avec de nombreux processus, comme ceux exécutés par la JVM.
Luís de Sousa

Pour quiconque fait référence à ce sujet, dans le commentaire ci-dessus, Luis fait référence à la réponse ci-dessous qui vante la pkill -f "Process name"commande ...
Digger

Réponses:


505
pkill firefox

Plus d'informations: http://linux.about.com/library/cmd/blcmdl1_pkill.htm


7
Utiliser pgrep pour comprendre ce que vous tuez avant de vous lancer dans les processus de destruction est une bonne chose. Surtout lors de l'utilisation -f.
Akrikos

pkill n'est pas très sympathique. vous ne pouvez pas lui donner de noms de la même manière que killall les prend.
Octopus

2
pkill -U <username>est assez pratique. J'ai un serveur Web Solaris , le démon de serveur Web réel, est configuré en tant que service avec son propre utilisateur. La spécification par l'utilisateur est donc un moyen simple / facile de déclencher un redémarrage.
Raystorm

6
Forcer à tuer: pkill -9 firefox
Justas

Cela fonctionne au mieux la moitié du temps. Vous avez besoin au moins du -fdrapeau pour une solution omnibus.
Luís de Sousa

112

Également possible d'utiliser:

pkill -f "Process name"

Pour moi, cela a fonctionné parfaitement. C'est ce que je cherchais. pkill ne fonctionne pas avec le nom sans le drapeau.

Lorsque -fest défini, la ligne de commande complète est utilisée pour la correspondance de modèle.


2
spécialement pour courir quelque chose avec du vin, l' -foption est vraiment nécessaire. par exemplepkill -f "EvilWindowsServer.exe"
CodeBrauer

Ce devrait être la réponse acceptée. La première réponse échoue avec de nombreux types de programmes, par exemple ceux qui s'exécutent sur une machine virtuelle Java.
Luís de Sousa

1
J'ai également dû ajouter le -fdrapeau pour tuer un processus d'arrière-plan exécutant un script Python.
Mason

dans mon cas, j'avais besoin de 2 drapeaux:pkill -f -9 PROCESSNAME
Slavik

son travail dans centos7.thank
sirmagid

64

Vous pouvez tuer les processus par leur nom aveckillall <name>

killall envoie un signal à tous les processus exécutant l'une des commandes spécifiées. Si aucun nom de signal n'est spécifié, SIGTERM est envoyé.

Les signaux peuvent être spécifiés soit par nom (par exemple -HUP ou -SIGHUP ), soit par numéro (par exemple -1 ) ou par l'option -s .

Si le nom de la commande n'est pas une expression régulière (option -r ) et contient une barre oblique (/), les processus exécutant ce fichier particulier seront sélectionnés pour être supprimés, indépendamment de leur nom.

Mais si vous ne voyez pas le processus avec ps aux, vous n'aurez probablement pas le droit de le tuer ...


6
Pour forcer la fin d'un programme qui ne répond pas, envoyez KILL au lieu de TERM:killall -s KILL firefox
Martin Hansen

45

Une alternative un peu plus longue:

kill `pidof firefox`

25
pidof firefox | xargs kill -9
hbt

1
celui-ci fonctionne sous busybox pour vos appareils embarqués :)
nwgat

25

La façon la plus simple de procéder consiste à vérifier d'abord que vous obtenez les bons ID de processus avec:

pgrep -f [part_of_a_command]

Si le résultat est comme prévu. Aller avec:

pkill -f [part_of_a_command]

19

Étrange, mais je n'ai pas vu la solution comme celle-ci:

kill -9 `pidof firefox`

il peut également tuer plusieurs processus (plusieurs pids) comme:

kill -9 `pgrep firefox`

Je préfère pidofcar il a une sortie sur une seule ligne:

> pgrep firefox
6316
6565
> pidof firefox
6565 6316

Lorsque j'exécute cela, j'ai eu l'erreur kill: invalid number 'pidof myprogram'. Qu'est-ce qui est mauvais ici?.
Brethlosze

cela m'a sauvé la vie aujourd'hui ... Je ne veux pas en écrire plus mais je suis content de l'avoir trouvé ici. Merci mec.
MilMike

1
Arrivant tard mais au cas où quelqu'un d'autre se demanderait… @Brethlosze vous mettez des ticks simples, tandis que la commande nécessite des backticks.
spectras

Merci! .. je serai (et je suis) au courant de ces astuces :)
Brethlosze

13

Tuez tous les processus ayant snippetdans le chemin de démarrage. Vous pouvez tuer toutes les applications démarrées à partir d'un répertoire en mettant / répertoire / comme extrait. Ceci est très utile lorsque vous démarrez plusieurs composants pour la même application à partir du même répertoire d'application.

ps ax | grep <snippet> | grep -v grep | awk '{print $1}' | xargs kill

* Je préfère pgrep si disponible


1
Il s'agit d'une combinaison d'antipatrons fréquemment observée. Utilisez une expression régulière qui ne correspond pas à elle-même (ou le nom du script contenant) et évitez une inutilegrep . ps ax | awk '/[s]nippet/ { print $1 }' | xargs kill
tripleee

1
tout en évitant les grep inutiles, vous n'évitez pas les fautes de frappe et la possibilité d'utiliser la commande dans des processus automatisés qui paramètrent le <snippet>
Mike

C'EST en effet la meilleure façon de le faire!
Abhinandan Dubey

Serait formidable de comprendre pourquoi @ tripleee's [s]fonctionne en termes de non-correspondance avec le processus awk lui-même?
andig

Parce que l'expression régulière [x]ycorrespond à la chaîne, xymais pas vice versa. Il s'agit d'une FAQ courante. Le lien est vers une page d'il y a plus de 20 ans qui explique cela plus en détail; et c'était déjà une question récurrente.
tripleee

11

Sur Mac, je ne pouvais pas trouver le pgrep et le pkill.

export pid=`ps | grep process_name | awk 'NR==1{print $1}' | cut -d' ' -f1`;kill $pid

S'il existe un moyen plus simple de le faire, veuillez le partager.


1
Lol. C'est une commande insensée pour une telle tâche. Ça ne fait rien. Avez-vous appelé cette simple ligne? : D Simple is killall
m3nda

@ erm3nda :-) D'accord. Avec le recul, cela semble fou. Je ne me souviens pas pourquoi killall ne fonctionnait pas sur mon mac alors.
Dhiraj

Ceci est très utile lorsque vous voulez tuer un certain processus Java comme "jboss". Dans ce cas, killall n'aide pas.
Jan M


6

Pour tuer avec grep:

kill -9 `pgrep myprocess`

5

plus correct serait:

export pid=`ps aux | grep process_name | awk 'NR==1{print $2}' | cut -d' ' -f1`;kill -9 $pid

1
Pourquoi avez-vous exportune variable que vous n'utiliserez qu'une seule fois dans le même processus?
tripleee


3

Je me posais la même question mais le problème avec les réponses actuelles est qu'elles ne vérifient pas en toute sécurité les processus à tuer donc ... cela pourrait conduire à de terribles erreurs :)) ... surtout si plusieurs processus correspondent au schéma .

Comme avertissement, je ne suis pas un pro de la mer et il y a certainement place à amélioration.

J'ai donc écrit un petit script sh:

#!/bin/sh

killables=$(ps aux | grep $1 | grep -v mykill | grep -v grep)
if [ ! "${killables}" = "" ]
then
  echo "You are going to kill some process:"
  echo "${killables}"
else
  echo "No process with the pattern $1 found."
  return
fi
echo -n "Is it ok?(Y/N)"
read input
if [ "$input" = "Y" ]
then
  for pid in $(echo "${killables}" | awk '{print $2}')
  do
    echo killing $pid "..."
    kill $pid 
    echo $pid killed
  done
fi

2

Si vous exécutez GNOME, vous pouvez utiliser le moniteur système (Système-> Administration-> Moniteur système) pour tuer les processus comme vous le feriez sous Windows. KDE aura quelque chose de similaire.


2

La killcommande par défaut accepte les noms de commande comme alternative au PID. Voir kill (1) . Un problème qui survient souvent est qu'il bashfournit le sien killqui accepte les numéros de travail, comme kill %1, mais pas les noms de commande. Cela entrave la commande par défaut. Si la première fonctionnalité vous est plus utile que la seconde, vous pouvez désactiver la bashversion en appelant

enable -n kill

Pour plus d'informations, voir killet enableentrées dans bash (1) .


Comment puis-je réactiver l'action enable -n kill?
Brethlosze

1
@hyprfrcbenable kill
The Vee



0

awk oneliner, qui analyse l'en-tête de la pssortie, vous n'avez donc pas besoin de vous soucier des numéros de colonne (mais des noms de colonne). Soutenir l'expression régulière. Par exemple, pour tuer tous les processus, quel nom exécutable (sans chemin) contient le mot "firefox" essayez

ps -fe | awk 'NR==1{for (i=1; i<=NF; i++) {if ($i=="COMMAND") Ncmd=i; else if ($i=="PID") Npid=i} if (!Ncmd || !Npid) {print "wrong or no header" > "/dev/stderr"; exit} }$Ncmd~"/"name"$"{print "killing "$Ncmd" with PID " $Npid; system("kill "$Npid)}' name=.*firefox.*
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.