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


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

0р

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.