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.

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.


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()

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')

@ 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")

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")

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()

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)

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)

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.


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.


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()

0

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

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

0r

os.sytem("kill -KILL 1234")

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)

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)

-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()
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.