web-dev-qa-db-fra.com

Tuer le processus par son nom?

J'essaie de tuer un processus (en particulier iChat). Sur la ligne de commande, j'utilise ces commandes:

ps -A | grep iChat 

Ensuite:

kill -9 PID

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

78
Aaron

En supposant que vous soyez sur une plate-forme de type Unix (pour 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 le décomposer en lignes et les boucler ...:

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

(vous pouvez éviter d'importer signal et utiliser 9 au lieu de signal.SIGKILL, mais je n'aime pas particulièrement ce style, je préfère donc utiliser la constante nommée de cette façon).

Bien sûr, vous pourriez effectuer un traitement beaucoup plus sophistiqué sur ces lignes, mais cela ressemble à ce que vous faites dans Shell.

Si vous cherchez à éviter ps, il est difficile de le 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 à l’esprit un système spécifique de type Unix, cela ne sera peut-être pas nécessaire (ne nécessitant aucune portabilité multiplate-forme); en particulier, sous Linux, le pseudo-système de fichiers /proc est très utile. Mais vous aurez besoin de clarifier vos exigences exactes avant que nous puissions vous aider sur cette dernière partie.

71
Alex Martelli

psutil peut trouver un processus par son nom et le tuer:

import psutil

PROCNAME = "python.exe"

for proc in psutil.process_iter():
    # check whether the process name matches
    if proc.name() == PROCNAME:
        proc.kill()
163
Giampaolo Rodolà

Si vous devez considérer le cas Windows pour être multi-plateforme, essayez ce qui suit:

os.system('taskkill /f /im exampleProcess.exe')
30
limitcracker

Si vous avez killall:

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

Ou:

os.system("ps -C iChat -o pid=|xargs kill -9")
19
Matthew Flaschen

cela a fonctionné pour moi dans Windows 7

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

Le code ci-dessous supprimera tous les programmes orientés 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)
2
Poobalan

Vous pouvez utiliser pkill <process_name> dans un système unix pour tuer le processus par son nom.

Ensuite, le code python sera:

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

Pour moi, la seule chose qui a fonctionné est:

Par exemple

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

Si vous souhaitez supprimer le ou les processus ou cmd.exe portant un titre particulier.

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 ) 

J'espère que ça aide. Leur pourrait être de nombreuses meilleures solutions à la mienne.

1
Thangasivam Gandhi
import os
os.popen("kill -9 $(ps aux | grep  " + processname + " | awk '{print $2}')")
0
ishandutta2007

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

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

0r

os.sytem("kill -KILL 1234")
0
SuperNova

vous pouvez utiliser le module WMI pour le faire sous Windows, bien que ce soit beaucoup plus bruyant que ce à quoi vous êtes habitués unix import WMI prend beaucoup de temps et il y a une douleur intermédiaire à obtenir au processus.

0
amwinter

vous pouvez essayer ceci ... avant de devoir installer psutil en utilisant Sudo pip install psutil

import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
    if 'ichat' in proc.info['name']:
        proc.kill()
0
Bakarali Sunasra