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

Jeremy Ruten
la source
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

shoosh
la source
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.

Victor
la source
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 ...

Andre Bossard
la source
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`
Walter
la source
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]
Tahsin Turkoz
la source
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
prosti
la source
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

Mike
la source
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.

Dhiraj
la source
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
9

Utilisation de la #killallcommande:

#killall -9 <processname>
user2396265
la source
6

Pour tuer avec grep:

kill -9 `pgrep myprocess`
edW
la source
5

plus correct serait:

export pid=`ps aux | grep process_name | awk 'NR==1{print $2}' | cut -d' ' -f1`;kill -9 $pid
Chadiso
la source
1
Pourquoi avez-vous exportune variable que vous n'utiliserez qu'une seule fois dans le même processus?
tripleee
4

J'utilise normalement la killallcommande.

Vérifiez ce lien pour plus de détails sur cette commande.

Bittercoder
la source
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
Fab
la source
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.

Bernard
la source
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) .

The Vee
la source
Comment puis-je réactiver l'action enable -n kill?
Brethlosze
1
@hyprfrcbenable kill
The Vee
1

kill -9 $ (ps aux | grep -e myprocessname | awk '{print $ 2}')

Nived Thanima
la source
0
ps aux | grep processname | cut -d' ' -f7 | xargs kill -9 $
query_port
la source
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.*
Andrey Bochkov
la source