İşlemi isme göre öldür?


100

Bir süreci (özellikle iChat'i) öldürmeye çalışıyorum. Komut satırında şu komutları kullanıyorum:

ps -A | grep iChat 

Sonra:

kill -9 PID

Ancak, bu komutları Python'a nasıl çevireceğimden tam olarak emin değilim.

Yanıtlar:


85

Unix benzeri bir platformda olduğunuzu varsayarsak (öyle ki ps -Avar),

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

değişkendeki (bir dizge) ps -Açıktısını verir out. Bunu satırlara ayırabilir ve üzerlerinde döngü yapabilirsiniz ...:

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

(ithal etmekten kaçınabilir signalve 9yerine kullanabilirsiniz signal.SIGKILL, ancak bu stili özellikle sevmiyorum, bu yüzden adlandırılmış sabiti bu şekilde kullanmayı tercih ettim).

Elbette bu hatlar üzerinde çok daha karmaşık işlemler yapabilirsiniz, ancak bu, kabukta yaptığınız şeyi taklit eder.

Peşinde olduğunuz şey kaçınmaksa ps, bunu farklı Unix benzeri sistemlerde yapmak zordur ( psbir anlamda işlem listesi almak için ortak API'larıdır). Ancak aklınızda belirli bir Unix benzeri sistem varsa, yalnızca (platformlar arası taşınabilirlik gerektirmeyen) bu mümkün olabilir; özellikle Linux'ta /procsözde dosya sistemi çok faydalıdır. Ancak bu ikinci bölümde yardımcı olabilmemiz için önce tam olarak gereksinimlerinizi netleştirmeniz gerekecek.


1
Bu çok iyi çalıştı! Bir Mac ortamı çalıştırıyorum, bu yüzden bunun mükemmel olacağını düşünüyorum. Tüm yardımların için teşekkür ederim.
Aaron

Yukarısı .nix üzerinde çalışır, ancak pitonik değildir. Aşağıda belirtildiği gibi onaylama yolu, çekirdek python'un bir parçası olan os.system ('taskkill / f / im exampleProcess.exe') yaklaşımını kullanmaktır.
Jonesome Reinstate Monica

@Jonesome: Cevabınız Windows için görünüyor (komut sözdizimi ve .exe dosya adı nedeniyle), ancak soru Mac OS için görünüyor.
Vasudev Ram

Giampaolo Rodolà'nın cevabını tercih ederim çünkü çok Pythonic olmasa da, Cygwin veya Msys'in kurulu olduğunu varsayarak Windows üzerinde çalışıyor. psutil, Windows'ta Python 2.7.10'da mevcut değildir. Makinemde "pip yükleme psutil" denemesi başarısız oldu ve Visual C ++ 9.0 yüklemem gerektiğini söyledim. Siktir et! Cygwin veya Msys'i kurmayı tercih ederim.
Andrew Bainbridge

Python 3.2'den beri Windows'ta çalışır, ancak genellikle sinyal, öldürülen işlemin çıkış kodu olacaktır.
Cees Timmerman

209

psutil işlemi isme göre bulabilir ve öldürebilir:

import psutil

PROCNAME = "python.exe"

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

52
Bu. Çünkü çapraz platformdur .
Bengt

2
veya komut satırıyla şöyle bir şey istiyorsanız: if "your_python_script.py" proc.cmdline'da: ..kill
OWADVL

11
Bunun dezavantajı psutil, hedef makinede bulunmayabilecek paketi gerektirmesidir .
CadentOrange

1
@Bengt. Windows'u dahil ederseniz , bu çapraz platform değildir ! psutil, Python 2.7.10'un bir parçası değildir. Ve "pip install psutil", Visual C ++ 9.0'ı yüklemediğiniz sürece başarısız olur, bu da çoğu durumda pratik olmayacaktır. Yine de, 17 olumlu oyunuz için tebrikler :-)
Andrew Bainbridge

5
"pip install psutil", pypi üzerindeki tekerlek sürümünü alacağı için gayet iyi çalışacaktır. Ve hayır, bir derleyiciye ihtiyacınız yok.
Giampaolo Rodolà

35

Çapraz platform olması için Windows durumunu göz önünde bulundurmanız gerekiyorsa, aşağıdakileri deneyin:

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

@ alansiqueira27 Maalesef sadece Windows cmd durumu. Çapraz platform çözümleri için yukarıdaki cevapları görmelisiniz.
limitcracker

Bu benim kullanım durumum için çalıştı. Thanx! Bunun düzgün olduğunu, tüm işlemleri bu adla öldürdüğünü unutmayın, bu nedenle birden fazla Y.exe'nin sona ermemesi durumunda, tüm işlem kimlikleri sonlandırılacaktır.
DeğişmeliAlgebraÖğrenci

22

Killall varsa:

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

Veya:

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

9
Ayrıca pkill, bunu dünyada kullanan tek kişi olduğumu düşünmeme rağmenkillall
Michael Mrozek

1
Tamam harika, evet, ilk komut mükemmel çalışıyor gibi görünüyor. Yardım için teşekkürler.
Aaron

1
@MichaelMrozek gibi şeyleri yazmanın tatlı duygusuyla nasıl yaşayabilirsin killall java?
Alois Mahdal

@Michael kullanıyorum pkillçünkü tek killallfarkında olduğum "her şeyi öldür" idi.
Kyle Strand

6

bu benim için Windows 7'de çalıştı

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

4

Bunu deneyebilirsin. ancak psutil'i kullanarak yüklemeniz gerekmeden öncesudo pip install psutil

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

kabul edilen cevap bu çözümü zaten tanımlasa bile en azından bu taşınabilirdir.
Jean-François Fabre

1

Aşağıdaki kod tüm iChat odaklı programları öldürecektir:

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)

1

İşlem nesnesini Process.

>>> import psutil
>>> p = psutil.Process(23442)
>>> p
psutil.Process(pid=23442, name='python3.6', started='09:24:16')
>>> p.kill()
>>> 

0

pkill <process_name>Bir unix sisteminde işlemi isme göre öldürmek için kullanabilirsiniz .

O zaman python kodu şöyle olacaktır:

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

Kullandığım tüm sistemler Mac ve pkill'i çalıştırmaya çalıştığımda bana sadece komutun bulunamadığını söylüyor.
Aaron

0

Windows'ta bunu yapmak için WMI modülünü kullanabilirsiniz, ancak bu, unix'in alıştığınızdan çok daha hantaldır; import WMIuzun zaman alır ve sürece girmek için orta derecede ağrı vardır.


0

İşlemleri veya belirli bir başlığı / başlıkları taşıyan cmd.exe'yi öldürmek istiyorsanız.

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 ) 

Umarım yardımcı olur. Benim için sayısız daha iyi çözümler olabilir.


0

Alex Martelli cevabı Python 3'te çalışmayacaktır çünkü outbir bayt nesnesi olacaktır ve bu nedenle TypeError: a bytes-like object is required, not 'str'test sırasında bir sonuç olacaktır if 'iChat' in line:.

Alt işlem belgelerinden alıntı yapma :

communication () bir demet döndürür (stdout_data, stderr_data). Akışlar metin modunda açılmışsa veriler dizeler olacaktır; aksi takdirde bayt.

Python 3 için bu, yapıcıya text=True(> = Python 3.7) veya universal_newlines=Trueargüman eklenerek çözülür Popen. outdaha sonra bir dizge nesnesi olarak döndürülür.

import subprocess, signal
import os

p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE, text=True)
out, err = p.communicate()

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

Alternatif olarak, baytların decode () yöntemini kullanarak bir dize oluşturabilirsiniz.

import subprocess, signal
import os

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

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

-1

Benim için işe yarayan tek şey şuydu:

Örneğin

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

-1
import os, signal

def check_kill_process(pstring):
    for line in os.popen("ps ax | grep " + pstring + " | grep -v grep"):
        fields = line.split()
        pid = fields[0]
        os.kill(int(pid), signal.SIGKILL)

-2
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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.