2010-05-31 7 views
65

J'essaye de tuer un processus (spécifiquement iChat). Sur la ligne de commande, j'utilise ces commandes:Tuer le processus par son nom?

ps -A | grep iChat 

Puis:

kill -9 PID 

Cependant, je ne sais pas exactement comment traduire ces commandes vers Python.

Répondre

65

En supposant que vous êtes sur une plate-forme Unix (de sorte que ps -A existe),

>>> import subprocess, signal 
>>> p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE) 
>>> out, err = p.communicate() 

vous donne la sortie de ps -A dans la variable out (une chaîne). Vous pouvez décomposer en lignes et en boucle sur eux ...:

>>> for line in out.splitlines(): 
... if 'iChat' in line: 
...  pid = int(line.split(None, 1)[0]) 
...  os.kill(pid, signal.SIGKILL) 
... 

(vous pourriez éviter d'importer signal et utiliser 9 au lieu de signal.SIGKILL, mais je ne aime pas particulièrement ce style, donc je d plutôt utilisé la constante nommée de cette façon).

Bien sûr, vous pourriez faire un traitement beaucoup plus sophistiqué sur ces lignes, mais cela imite ce que vous faites en shell. Si ce que vous cherchez est d'éviter ps, c'est difficile à faire sur différents systèmes de type Unix (ps est leur API commune pour obtenir une liste de processus, dans un sens). Mais si vous avez un système Unix spécifique à l'esprit, seulement (ne nécessitant aucune portabilité multiplateforme), cela peut être possible; en particulier, sur Linux, le pseudo-système de fichiers /proc est très utile. Mais vous aurez besoin de clarifier vos besoins exacts avant de pouvoir vous aider sur cette dernière partie.

+0

Cela a très bien fonctionné! Je cours un environnement Mac donc je pense que ce sera parfait. Je vous remercie pour votre aide. – Aaron

+0

@Aaron, de rien! –

+0

Ci-dessus fonctionne sur .nix, mais n'est pas pythonique. La méthode appropriée, telle que publiée ci-dessous, consiste à utiliser l'approche os.system ('taskkill/f/im exampleProcess.exe'), qui fait partie de core python. – Jonesome

15

Si vous avez killall:

os.system("killall -9 iChat"); 

Ou:

os.system("ps -C iChat -o pid=|xargs kill -9") 
+6

Il y a aussi 'pkill', même si je pense que je suis la seule personne dans le monde qui l'utilise au lieu de' killall' –

+1

Ok cool, oui on dirait que la première commande a fonctionné parfaitement. Merci pour l'aide. – Aaron

+0

@MichaelMrozek Comment pouvez-vous vivre avec le doux sentiment de taper des choses comme «killall java»? –

-1

vous pouvez les commandes exactes de python comme celui-ci

import os 
print os.system('kill -9 ' + pid) 

Mais votre commande sur obtenir le pid a besoin d'un peu de travail si (ne peut pas simplement supposer juste parce qu'il a iChat que c'est vraiment iChat), vous devez utiliser killall inste annonce que Suggérée par Matthew Flaschen

1

Vous pouvez utiliser pkill <process_name> dans un système Unix pour arrêter le processus par son nom.

Ensuite, le code python sera:

>>> import os 
>>> process_name=iChat 
>>> os.system('pkill '+process_name) 
+0

Tous les systèmes que j'utilise sont Mac et quand j'essaie de lancer pkill, c'est juste pour me dire que la commande est introuvable. – Aaron

0

vous pouvez utiliser le module WMI pour ce faire sur les fenêtres, mais il est beaucoup clunkier que vous les gens unix êtes habitué; import WMI prend beaucoup de temps et il y a une douleur intermédiaire pour arriver au processus.

136

psutil peut trouver processus par son nom et tuez-le:

import psutil 

PROCNAME = "python.exe" 

for proc in psutil.process_iter(): 
    # check whether the process name matches 
    if proc.name() == PROCNAME: 
     proc.kill() 
+33

Ceci. Parce que c'est ** cross platform **. – Bengt

+2

ou si vous voulez par ligne de commande quelque chose comme: si "your_python_script.py" dans proc.cmdline: ..kill – OWADVL

+9

L'inconvénient de ceci est qu'il nécessite le paquet 'psutil', qui peut ne pas être présent sur la machine cible. – CadentOrange

2

Le code ci-dessous tueront tous les programmes axés sur iChat:

p = subprocess.Popen(['pgrep', '-l' , 'iChat'], stdout=subprocess.PIPE) 
out, err = p.communicate() 

for line in out.splitlines():   
    line = bytes.decode(line) 
    pid = int(line.split(None, 1)[0]) 
    os.kill(pid, signal.SIGKILL) 
28

Si vous devez considérer le cas de Windows afin d'être multiplateforme, puis essayez ce qui suit:

os.system('taskkill /f /im exampleProcess.exe') 
-1
import psutil 
pid_list=psutil.get_pid_list() 
print pid_list 
p = psutil.Process(1052) 
print p.name 
for i in pid_list: 
    p = psutil.Process(i) 
    p_name=p.name 
    print str(i)+" "+str(p.name) 
    if p_name=="PerfExp.exe": 
     print "*"*20+" mam ho "+"*"*20 
     p.kill() 
1

Pour moi, la seule chose qui a travaillé est été:

Par exemple

import subprocess 
proc = subprocess.Popen(["pkill", "-f", "scriptName.py"], stdout=subprocess.PIPE) 
proc.wait() 
1

Si vous voulez tuer le processus (es) ou cmd.exe portant un titre particulier (s).

import csv, os 
import subprocess 
# ## Find the command prompt windows. 
# ## Collect the details of the command prompt windows and assign them. 
tasks = csv.DictReader(subprocess.check_output('tasklist /fi "imagename eq cmd.exe" /v /fo csv').splitlines(), delimiter=',', quotechar='"') 
# ## The cmds with titles to be closed. 
titles= ["Ploter", "scanFolder"] 

# ## Find the PIDs of the cmds with the above titles. 
PIDList = [] 
for line in tasks: 
    for title in titles: 
     if title in line['Window Title']: 
      print line['Window Title']  
      PIDList.append(line['PID']) 

# ## Kill the CMDs carrying the PIDs in PIDList 
for id in PIDList: 
    os.system('taskkill /pid ' + id) 

Espérons que ça aide. Leur pourrait être de nombreuses meilleures solutions pour le mien.

3

cela a fonctionné pour moi dans windows 7

import subprocess 
subprocess.call("taskkill /IM geckodriver.exe") 
0

9 représente le signal SIGKILL. Vous pouvez donc utiliser KILL en place de 9

os.system("kill -s KILL 1234") 

0r

os.sytem("kill -KILL 1234")