web-dev-qa-db-fra.com

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

Parfois, lorsque j'essaie de démarrer Firefox, il est écrit "un processus Firefox est déjà en cours d'exécution". Donc je dois 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 grep pour cela (ou autre chose) dans la liste des processus, et tuerait tous les processus dans la sortie:

jeremy@jeremy-desktop:~$ killbyname firefox

J'ai essayé de le faire dans PHP mais exec('ps aux') ne semble afficher que les processus exécutés avec exec() dans le script PHP lui-même (le seul processus de traitement montre est lui-même.)

311
Jeremy Ruten
pkill firefox

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

463
shoosh

Aussi possible d'utiliser:

pkill -f "Process name".

Pour moi, ça a fonctionné parfaitement. C'était ce que je cherchais. pkill ne fonctionne pas avec name sans le drapeau.

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

89
Victor

Vous pouvez tuer des processus par nom avec killall <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 ) ou par numéro (par exemple - 1 ) ou par 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 la suppression, indépendant de leur nom.

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

63
Andre Bossard

Une alternative un peu plus longue:

kill `pidof firefox`
42
Walter

La meilleure façon de le faire est d’abord de vérifier 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]
20
Tahsin Turkoz

É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 pidof car il a une sortie ligne unique:

> pgrep firefox
6316
6565
> pidof firefox
6565 6316
18
prosti

Sur Mac, je ne pouvais pas trouver pgrep et pkill, ni killall ne fonctionnait donc j'ai écrit un script simple avec un liner: -

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, partagez-le.

11
Dhiraj

Supprimez tous les processus ayant snippet dans le chemin de démarrage. Vous pouvez supprimer toutes les applications lancées à partir de certains répertoires en plaçant/directory/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érerais pgrep si disponible

9

Utilisation de la commande #killall:

#killall -9 <processname>
9
user2396265

Pour tuer avec grep:

kill -9 `pgrep myprocess`
6
edW

plus correct serait:

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

J'utilise normalement la commande killall voir ici pour plus de détails.

4
Bittercoder

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

En tant que clause de non-responsabilité, je ne suis pas un professionnel de la SH et il y a certainement matière à 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
3
Fab

La commande par défaut kill accepte les noms de commande comme alternative au PID. Voir kill (1) . Un problème récurrent est que bash fournit son propre kill qui accepte des numéros de travail, tels que kill %1, mais pas les noms de commande. Cela empêche la commande par défaut. Si la première fonctionnalité vous est plus utile que la dernière, vous pouvez désactiver la version bash en appelant

enable -n kill

Pour plus d'informations, voir les entrées kill et enable dans bash (1) .

2
The Vee

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.

1
Bernard
ps aux | grep processname | cut -d' ' -f7 | xargs kill -9 $
0
query_port

awk oneliner, qui analyse l'en-tête de la sortie ps, vous n'avez donc pas à vous soucier des numéros de colonne (mais des noms de colonne). Soutenez regex. Par exemple, pour tuer tous les processus, quel nom d’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.*
0
Andrey Bochkov

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

0
Nived Thanima