Quá trình giết bằng tên?


99

Tôi đang cố gắng loại bỏ một quy trình (cụ thể là iChat). Trên dòng lệnh, tôi sử dụng các lệnh sau:

ps -A | grep iChat 

Sau đó:

kill -9 PID

Tuy nhiên, tôi không chắc chắn chính xác cách dịch các lệnh này sang Python.

Câu trả lời:


86

Giả sử bạn đang sử dụng một nền tảng giống Unix (để ps -Atồn tại),

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

cung cấp cho bạn ps -Ađầu ra trong outbiến (một chuỗi). Bạn có thể chia nhỏ nó thành các dòng và lặp lại chúng ...:

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

(bạn có thể tránh nhập signalvà sử dụng 9thay thế signal.SIGKILL, nhưng tôi không đặc biệt thích kiểu đó, vì vậy tôi muốn sử dụng hằng được đặt tên theo cách này).

Tất nhiên, bạn có thể xử lý phức tạp hơn nhiều trên những đường này, nhưng điều này bắt chước những gì bạn đang làm trong shell.

Nếu những gì bạn đang theo đuổi đang tránh ps, điều đó khó thực hiện trên các hệ thống giống Unix khác nhau ( pstheo một nghĩa nào đó là API chung của chúng để lấy danh sách quy trình). Nhưng nếu bạn có ý nghĩ về một hệ thống giống Unix cụ thể (không yêu cầu bất kỳ tính di động đa nền tảng nào), thì có thể; đặc biệt, trên Linux, /prochệ thống tập tin giả rất hữu ích. Nhưng bạn sẽ cần làm rõ các yêu cầu chính xác của mình trước khi chúng tôi có thể trợ giúp về phần sau này.


1
Điều đó hoạt động rất tốt! Tôi đang chạy môi trường Mac nên tôi nghĩ điều này sẽ hoàn hảo. Cảm ơn bạn cho tất cả sự giúp đỡ của bạn.
Aaron,

Ở trên hoạt động trên .nix, nhưng không phải là pythonic. Cách chấp thuận, như được đăng bên dưới, là sử dụng phương pháp os.system ('taskkill / f / im exampleProcess.exe'), là một phần của core python.
Jonesome Reinstate Monica

@Jonesome: Câu trả lời của bạn dường như dành cho Windows (do cú pháp lệnh và tên tệp .exe), nhưng câu hỏi dường như dành cho Mac OS.
Vasudev Ram

Tôi thích câu trả lời này hơn câu trả lời của Giampaolo Rodolà bởi vì, mặc dù nó không phải là Pythonic, nhưng nó hoạt động trên Windows giả sử bạn đã cài đặt Cygwin hoặc Msys. psutil không có trong Python 2.7.10 trên Windows. Cố gắng "pip install psutil" không thành công trên máy của tôi, nói rằng tôi cần cài đặt Visual C ++ 9.0. Kệ đời nó! Tôi muốn cài đặt Cygwin hoặc Msys.
Andrew Bainbridge

Hoạt động trong Windows kể từ Python 3.2, nhưng thông thường tín hiệu sẽ là mã thoát của quá trình bị giết.
Cees Timmerman

202

psutil có thể tìm thấy quá trình theo tên và giết nó:

import psutil

PROCNAME = "python.exe"

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

51
Điều này. Bởi vì nó là nền tảng chéo .
Kéo dài

2
hoặc nếu bạn muốn bằng dòng lệnh như: if "your_python_script.py" trong proc.cmdline: ..kill
OWADVL

11
Nhược điểm của điều này là nó yêu cầu psutilgói, có thể không có trên máy đích.
CadentOrange

1
@Bengt. Đây không phảinền tảng chéo nếu bạn bao gồm Windows! psutil không phải là một phần của Python 2.7.10. Và "pip install psutil" không thành công trừ khi bạn cài đặt Visual C ++ 9.0, điều này sẽ không thực tế trong nhiều trường hợp. Tuy nhiên, chúc mừng vì 17 lượt ủng hộ của bạn :-)
Andrew Bainbridge

5
"pip install psutil" sẽ hoạt động tốt vì nó sẽ truy xuất phiên bản bánh xe trên pypi. Và không, bạn không cần trình biên dịch.
Giampaolo Rodolà

36

Nếu bạn phải xem xét trường hợp Windows để trở thành đa nền tảng, hãy thử các cách sau:

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

@ alansiqueira27 Thật không may, đó chỉ là trường hợp cmd của Windows. Bạn phải xem các câu trả lời ở trên cho các giải pháp đa nền tảng.
limitcracker

Điều này làm việc cho trường hợp sử dụng của tôi. Thanx! Lưu ý rằng điều này rất gọn gàng, nó giết tất cả các tiến trình bằng tên đó, vì vậy nếu bạn có nhiều Y.exe không kết thúc, tất cả id tiến trình của nó sẽ bị chấm dứt.
AlgebraicGeometryStudent

23

Nếu bạn có killall:

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

Hoặc là:

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

9
Ngoài ra pkill, mặc dù tôi nghĩ rằng tôi là người duy nhất trên thế giới sử dụng nó thay vìkillall
Michael Mrozek

1
Được rồi, có vẻ như lệnh đầu tiên hoạt động hoàn hảo. Cảm ơn đã giúp đỡ.
Aaron

1
@MichaelMrozek Làm thế nào bạn có thể sống với cảm giác ngọt ngào khi gõ những thứ như thế killall java?
Alois Mahdal

@Michael Tôi sử dụng pkillvì điều duy nhất killalltôi biết là "giết mọi thứ".
Kyle Strand

7

điều này làm việc cho tôi trong windows 7

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

3

Bạn có thể thử điều này. nhưng trước khi bạn cần cài đặt psutil bằng cách sử dụngsudo pip install psutil

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

ít nhất điều này là di động, ngay cả khi câu trả lời được chấp nhận đã mô tả giải pháp này.
Jean-François Fabre

2

Đoạn mã dưới đây sẽ giết tất cả các chương trình định hướng 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

Bạn có thể sử dụng pkill <process_name>trong một hệ thống unix để giết quá trình theo tên.

Sau đó, mã python sẽ là:

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

Tất cả các hệ thống tôi đang sử dụng đều là Mac và khi tôi cố chạy pkill, nó chỉ cho tôi biết rằng không thể tìm thấy lệnh.
Aaron

1

Nếu bạn muốn hủy (các) tiến trình hoặc cmd.exe mang (các) tiêu đề cụ thể.

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 ) 

Hy vọng nó giúp. Chúng có thể là nhiều giải pháp tốt hơn cho tôi.


0

bạn có thể sử dụng mô-đun WMI để thực hiện việc này trên windows, mặc dù nó phức tạp hơn rất nhiều so với những người unix quen thuộc; import WMImất một thời gian dài và có những cơn đau trung gian để nhận được trong quá trình này.


0

Đối với tôi, điều duy nhất có hiệu quả là:

Ví dụ

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

0

9 đại diện cho tín hiệu SIGKILL. Vì vậy, bạn có thể sử dụng KILLthay cho 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

Câu trả lời Alex Martelli sẽ không hoạt động trong Python 3 vì outnó sẽ là một đối tượng byte và do đó dẫn đến TypeError: a bytes-like object is required, not 'str'khi kiểm tra if 'iChat' in line:.

Trích dẫn từ tài liệu quy trình con :

Communication () trả về một tuple (stdout_data, stderr_data). Dữ liệu sẽ là chuỗi nếu các luồng được mở ở chế độ văn bản; ngược lại, byte.

Đối với Python 3, điều này được giải quyết bằng cách thêm text=True(> = Python 3.7) hoặc universal_newlines=Trueđối số vào hàm Popentạo. outsau đó sẽ được trả về dưới dạng một đối tượng chuỗi.

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)

Ngoài ra, bạn có thể tạo một chuỗi bằng cách sử dụng phương thức 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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.