it-swarm.com.de

Prozess nach Namen töten?

Ich versuche, einen Prozess (insbesondere iChat) zu beenden. In der Kommandozeile verwende ich folgende Befehle:

ps -A | grep iChat 

Dann:

kill -9 PID

Ich bin mir jedoch nicht sicher, wie ich diese Befehle auf Python übertragen kann.

78
Aaron

Angenommen, Sie befinden sich auf einer Unix-ähnlichen Plattform (damit ps -A existiert),

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

gibt die Ausgabe von ps -A in der Variable out (eine Zeichenfolge) aus. Sie können es in Zeilen aufteilen und auf sie einschleifen ...:

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

(Sie könnten vermeiden, signal zu importieren und 9 anstelle von signal.SIGKILL zu verwenden, aber ich mag diesen Stil nicht besonders, daher benutze ich die genannte Konstante lieber auf diese Weise.).

Natürlich können Sie in diesen Zeilen wesentlich komplexere Abläufe durchführen, aber dies ahmt nach, was Sie in Shell tun.

Wenn es darum geht, ps zu vermeiden, ist dies auf verschiedenen Unix-artigen Systemen schwer zu bewerkstelligen (ps ist in gewissem Sinne deren allgemeines API, um eine Prozessliste zu erhalten). Wenn Sie jedoch ein bestimmtes Unix-ähnliches System vor Augen haben (es ist keine plattformübergreifende Portabilität erforderlich), ist dies möglicherweise möglich. Insbesondere unter Linux ist das /proc-Pseudo-Dateisystem sehr hilfreich. Sie müssen jedoch Ihre genauen Anforderungen klären, bevor wir im letzten Teil helfen können.

71
Alex Martelli

psutil kann Prozess anhand des Namens finden und den Prozess beenden:

import psutil

PROCNAME = "python.exe"

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

Wenn Sie den Windows-Fall berücksichtigen müssen, um plattformübergreifend zu sein, versuchen Sie Folgendes:

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

Wenn Sie Killall haben:

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

Oder:

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

das funktionierte für mich in windows 7

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

Mit dem folgenden Code werden alle iChat-orientierten Programme beendet:

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

Sie können pkill <process_name> in einem Unix-System verwenden, um den Prozess nach Namen abzubrechen.

Der Python-Code lautet dann:

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

Für mich war das einzige, was funktioniert hat:

Zum Beispiel

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

Wenn Sie den/die Prozess (e) oder cmd.exe mit bestimmten Titeln beenden möchten.

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 ) 

Ich hoffe es hilft. Es könnte zahlreiche bessere Lösungen für meine geben.

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

9 repräsentiert das SIGKILL-Signal. Sie können also KILL anstelle von 9 verwenden

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

0r

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

sie können das WMI-Modul dazu unter Windows verwenden, obwohl es viel unübersichtlicher ist, als Sie es von Unix-Leuten gewohnt sind. import WMI dauert sehr lange und es gibt mittelmäßige Schmerzen, um an den Prozess zu gelangen.

0
amwinter

sie können dies ausprobieren, bevor Sie psutil mit Sudo pip install psutil installieren.

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