Bunuh proses dengan nama?

99

Saya mencoba menghentikan proses (khususnya iChat). Pada baris perintah, saya menggunakan perintah ini:

ps -A | grep iChat 

Kemudian:

kill -9 PID

Namun, saya tidak begitu yakin bagaimana menerjemahkan perintah ini ke Python.

Aaron
sumber

Jawaban:

86

Dengan asumsi Anda menggunakan platform mirip Unix (jadi itu ps -Aada),

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

memberi Anda ps -Aoutput dalam outvariabel (string). Anda dapat memecahnya menjadi beberapa baris dan mengulanginya ...:

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

(Anda dapat menghindari mengimpor signal, dan menggunakan 9alih-alih signal.SIGKILL, tetapi saya hanya tidak terlalu menyukai gaya itu, jadi saya lebih suka menggunakan konstanta bernama dengan cara ini).

Tentu saja Anda dapat melakukan pemrosesan yang jauh lebih canggih pada jalur ini, tetapi ini meniru apa yang Anda lakukan di shell.

Jika yang Anda kejar adalah menghindari ps, itu sulit dilakukan di berbagai sistem mirip Unix ( psadalah API umum mereka untuk mendapatkan daftar proses, dalam arti tertentu). Tetapi jika Anda hanya memikirkan sistem mirip Unix tertentu (tidak memerlukan portabilitas lintas platform), itu mungkin; khususnya, di Linux, sistem file /procsemu sangat membantu. Tetapi Anda harus mengklarifikasi persyaratan persis Anda sebelum kami dapat membantu di bagian terakhir ini.

Alex Martelli
sumber
1
Itu bekerja dengan sangat baik! Saya menjalankan lingkungan Mac jadi saya pikir ini akan sempurna. Terima kasih atas semua bantuannya.
Aaron
Di atas berfungsi pada .nix, tetapi bukan pythonic. Cara persetujuan, seperti yang diposting di bawah ini, adalah dengan menggunakan pendekatan os.system ('taskkill / f / im exampleProcess.exe'), yang merupakan bagian dari core python.
Jonesome Reinstate Monica
@Jonesome: Jawaban Anda tampaknya untuk Windows (karena sintaks perintah dan nama file .exe), tetapi pertanyaannya tampaknya untuk Mac OS.
Vasudev Ram
Saya lebih suka jawaban ini daripada Giampaolo Rodolà karena, meskipun tidak terlalu Pythonic, ini berfungsi pada Windows dengan asumsi Anda telah menginstal Cygwin atau Msys. psutil tidak ada di Python 2.7.10 di Windows. Mencoba "pip install psutil" gagal pada mesin saya, mengatakan bahwa saya perlu menginstal Visual C ++ 9.0. Persetan! Saya lebih suka menginstal Cygwin atau Msys.
Andrew Bainbridge
Bekerja di Windows sejak Python 3.2, tetapi biasanya sinyal akan menjadi kode keluar dari proses yang dimatikan.
Cees Timmerman
202

psutil dapat menemukan proses dengan nama dan membunuhnya:

import psutil

PROCNAME = "python.exe"

for proc in psutil.process_iter():
    # check whether the process name matches
    if proc.name() == PROCNAME:
        proc.kill()
Giampaolo Rodolà
sumber
51
Ini. Karena ini lintas platform .
Bengt
2
atau jika Anda ingin menggunakan baris perintah seperti: if "your_python_script.py" di proc.cmdline: ..kill
OWADVL
11
Kelemahan dari ini adalah membutuhkan psutilpaket, yang mungkin tidak ada di mesin target.
CadentOrange
1
@Tokopedia Ini bukan platform lintas jika Anda menyertakan Windows! psutil bukan bagian dari Python 2.7.10. Dan "pip install psutil" gagal kecuali Anda menginstal Visual C ++ 9.0, yang tidak praktis dalam banyak kasus. Namun, selamat atas 17 suara positif Anda :-)
Andrew Bainbridge
5
"pip install psutil" akan bekerja dengan baik karena akan mengambil versi roda di pypi. Dan tidak, Anda tidak membutuhkan kompiler.
Giampaolo Rodolà
36

Jika Anda harus mempertimbangkan kasus Windows untuk menjadi lintas platform, coba yang berikut ini:

os.system('taskkill /f /im exampleProcess.exe')
pembatas
sumber
@ alansiqueira27 Sayangnya ini hanya kasus cmd Windows. Anda harus melihat jawaban di atas untuk solusi lintas platform.
limitcracker
Ini berhasil untuk kasus penggunaan saya. Terima kasih! Perhatikan, ini rapi, itu membunuh semua proses dengan nama itu jadi jika Anda memiliki beberapa Y.exe tidak dihentikan, semua id proses itu akan dihentikan.
Murid AljabarGeometri
23

Jika Anda memiliki killall:

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

Atau:

os.system("ps -C iChat -o pid=|xargs kill -9")
Matthew Flaschen
sumber
9
Ada juga pkill, meskipun saya pikir saya satu-satunya orang di dunia yang menggunakannya daripadakillall
Michael Mrozek
1
Oke keren, ya sepertinya perintah pertama berfungsi dengan sempurna. Terima kasih untuk bantuannya.
Aaron
1
@MichaelMrozek Bagaimana Anda bisa hidup dengan perasaan manis mengetik hal-hal seperti killall java?
Alois Mahdal
@Michael saya gunakan pkillkarena satu-satunya yang killallsaya sadari adalah yang "bunuh semuanya".
Kyle Strand
7

ini berhasil untuk saya di windows 7

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

Anda bisa mencobanya. tetapi sebelumnya Anda perlu menginstal psutil menggunakansudo pip install psutil

import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
    if 'ichat' in proc.info['name']:
        proc.kill()
Bakarali Sunasra
sumber
setidaknya ini portabel, meskipun jawaban yang diterima sudah menjelaskan solusi ini.
Jean-François Fabre
2

Kode di bawah ini akan mematikan semua program berorientasi 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)
Poobalan
sumber
1

Anda dapat menggunakan pkill <process_name>sistem unix untuk menghentikan proses berdasarkan nama.

Maka kode pythonnya adalah:

>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)
xaph
sumber
Semua sistem yang saya gunakan adalah Mac dan ketika saya mencoba menjalankan pkill itu hanya memberi tahu saya bahwa perintah itu tidak dapat ditemukan.
Aaron
1

Jika Anda ingin menghentikan proses atau cmd.exe yang membawa judul tertentu.

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 ) 

Semoga membantu. Mungkin ada banyak solusi yang lebih baik untuk saya.

Thangasivam Gandhi
sumber
0

Anda dapat menggunakan modul WMI untuk melakukan ini di windows, meskipun itu jauh lebih kikuk daripada yang biasa Anda gunakan untuk unix; import WMImembutuhkan waktu lama dan ada rasa sakit menengah yang harus dihadapi dalam prosesnya.

musim dingin
sumber
0

Bagi saya satu-satunya hal yang berhasil adalah:

Sebagai contoh

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

9 mewakili sinyal SIGKILL. Jadi Anda bisa menggunakan KILLdi tempat 9

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

0r

os.sytem("kill -KILL 1234")
SuperNova
sumber
0
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)
Abhishek Kumar
sumber
0

Jawaban Alex Martelli tidak akan berfungsi di Python 3 karena outakan menjadi objek byte dan dengan demikian menghasilkan TypeError: a bytes-like object is required, not 'str'saat pengujian if 'iChat' in line:.

Mengutip dari dokumentasi subproses :

berkomunikasi () mengembalikan tupel (stdout_data, stderr_data). Data akan menjadi string jika aliran dibuka dalam mode teks; jika tidak, byte.

Untuk Python 3, ini diselesaikan dengan menambahkan text=True(> = Python 3.7) atau universal_newlines=Trueargumen ke Popenkonstruktor. outkemudian akan dikembalikan sebagai objek string.

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)

Alternatifnya, Anda dapat membuat string menggunakan metode decode () byte.

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)
Jason Stoller
sumber
-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()
peterik
sumber