Вбити процес на ім’я?


99

Я намагаюся вбити процес (конкретно iChat). У командному рядку я використовую ці команди:

ps -A | grep iChat 

Тоді:

kill -9 PID

Однак я не зовсім впевнений, як перекласти ці команди на Python.

Відповіді:


86

Припустимо, що ви перебуваєте на платформі, схожій на Unix (так, що ps -Aіснує),

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

дає ps -Aвихід у outзмінну (рядок). Ви можете розбити їх на рядки та нанести на них цикл ...:

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

(ви можете уникнути імпорту signalта використання 9замість signal.SIGKILL, але мені просто не дуже подобається такий стиль, тому я б скоріше використовував іменовану константу таким чином).

Звичайно, ви можете зробити набагато складнішу обробку на цих рядках, але це імітує те, що ви робите в оболонці.

Якщо ви цього уникаєте ps, цього важко зробити для різних систем, схожих на Unix ( psце певний API для отримання списку процесів у певному сенсі). Але якщо ви маєте на увазі лише конкретну систему, схожу на Unix (не вимагаючи переносимості між платформами), можливо, це можливо; зокрема, в Linux /procдуже допомагає псевдофайлова система. Але вам потрібно буде уточнити ваші точні вимоги, перш ніж ми зможемо допомогти в цій останній частині.


1
Це спрацювало дуже добре! Я працюю в середовищі Mac, тому думаю, що це буде ідеально. Дякуємо за всю вашу допомогу.
Аарон

Вище працює над .nix, але не є пітонічним. Відповідний спосіб, як розміщено нижче, полягає у використанні підходу os.system ('taskkill / f / im exampleProcess.exe'), який є частиною основного python.
Jonesome Reinstate Monica

@Jonesome: Здається, ваша відповідь стосується Windows (через синтаксис команд та ім'я файлу .exe), але питання, здається, стосується Mac OS.
Васудев Рам

Я віддаю перевагу цій відповіді Джампаоло Родола, тому що, хоч і не дуже пітонічний, він працює на Windows, припускаючи, що у вас встановлені Cygwin або Msys. psutil відсутній у Python 2.7.10 у Windows. Спроба "pip install psutil" не вдалася на моїй машині, сказавши, що мені потрібно встановити Visual C ++ 9.0. Закрутіть це! Краще я б встановив Cygwin або Msys.
Ендрю Бейнбрідж

Працює в Windows з Python 3.2, але зазвичай сигналом буде код виходу з убитого процесу.
Cees Timmerman

202

psutil може знайти процес за іменем і вбити його:

import psutil

PROCNAME = "python.exe"

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

51
Це. Тому що це кросова платформа .
Bengt

2
або якщо ви хочете за допомогою командного рядка щось на зразок: якщо "your_python_script.py" у proc.cmdline: ..kill
OWADVL

11
Недоліком цього є те, що для нього потрібен psutilпакет, який може бути відсутнім на цільовій машині.
CadentOrange

1
@Bengt. Це не крос-платформа, якщо ви включаєте Windows! psutil не є частиною Python 2.7.10. І "pip install psutil" не вдається, якщо ви не встановите Visual C ++ 9.0, що в багатьох випадках буде недоцільним. І все-таки вітаю вас з 17-ма заявами :-)
Ендрю Бейнбридж

5
"pip install psutil" спрацює чудово, оскільки буде завантажено колісну версію на pypi. І ні, вам не потрібен компілятор.
Giampaolo Rodolà

36

Якщо вам потрібно розглянути справу Windows, щоб бути платформою, то спробуйте наступне:

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

@ alansiqueira27 На жаль, це лише корпус Windows cmd. Ви повинні бачити відповіді вище для кросплатформних рішень.
обмежувач

Це працювало для мого випадку використання. Дякую! Зауважте, що це акуратно, воно вбиває всі процеси цим іменем, тому якщо у вас кілька Y.exe не закінчується, усі ідентифікатори процесу будуть припинені.
AlgebraicGeometryStudent

23

Якщо у вас є killall:

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

Або:

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

9
Є також pkill, хоча я думаю, що я єдина людина в світі, яка використовує його замістьkillall
Michael Mrozek

1
Гаразд, круто, так, схоже, перша команда спрацювала ідеально. Дякую за допомогу.
Аарон

1
@MichaelMrozek Як можна жити з приємним почуттям введення таких речей killall java?
Алоїз Магдал

@Michael я використовую, pkillтому що єдине, про що killallя знав, - це "вбити все".
Кайл Странд

7

це працювало для мене в Windows 7

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

3

Ви можете спробувати це. але перш ніж вам потрібно встановити psutil за допомогоюsudo pip install psutil

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

принаймні це портативно, навіть якщо прийнята відповідь вже описує це рішення.
Жан-Франсуа Фабр

2

Наведений нижче код знищить усі програми, орієнтовані на 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

Ви можете використовувати pkill <process_name>в системі Unix, щоб вбити процес за іменем.

Тоді код python буде таким:

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

Усі системи, якими я користуюся, - це Mac, і коли я намагаюся запустити pkill, це просто говорить мені, що команду неможливо знайти.
Аарон

1

Якщо ви хочете вбити процес (и) або cmd.exe з певними заголовками.

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 ) 

Сподіваюся, це допомагає. Вони можуть бути численними кращими рішеннями для шахти.


0

ви можете використовувати модуль WMI для цього у вікнах, хоча це набагато незграбніше, ніж ви звикли до Unix; import WMIзаймає тривалий час, і є проміжний біль, щоб отримати процес.


0

Для мене єдине, що працювало, це:

Наприклад

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

0

9 являє сигнал SIGKILL. Тож ви можете використовувати KILLзамість 9

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

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

Відповідь Алекса Мартеллі не працюватиме в Python 3, тому що outбуде об’єктом байтів і, таким чином, призведе до TypeError: a bytes-like object is required, not 'str'тестуванняif 'iChat' in line: .

Цитування з підпроцесорної документації :

commun () повертає кортеж (stdout_data, stderr_data). Дані будуть рядками, якщо потоки були відкриті в текстовому режимі; інакше байти.

Для Python 3 це вирішується додаванням text=True(> = Python 3.7) або universal_newlines=Trueаргументу до Popenконструктора. outбуде повернуто як об'єкт рядка.

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)

Крім того, ви можете створити рядок, використовуючи метод байтів decode ().

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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.