簡體   English   中英

按名稱殺死進程?

[英]Kill process by name?

我正在嘗試終止一個進程(特別是 iChat)。 在命令行上,我使用以下命令:

ps -A | grep iChat 

然后:

kill -9 PID

但是,我不確定如何將這些命令轉換為 Python。

psutil可以按名稱查找進程並殺死它:

import psutil

PROCNAME = "python.exe"

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

假設您在類 Unix 平台上(這樣ps -A存在),

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

out變量(字符串)中為您提供ps -A的輸出。 您可以將其分解為幾行並循環播放...:

>>> 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 ,但我只是不太喜歡這種風格,所以我寧願這樣使用命名常量)。

當然,您可以在這些行上進行更復雜的處理,但這模仿了您在 shell 中所做的事情。

如果您所追求的是避免ps ,那么在不同的類 Unix 系統中很難做到這一點(從某種意義上說, ps是他們獲取進程列表的通用 API)。 但是如果你有一個特定的類 Unix 系統,只有(不需要任何跨平台可移植性),它可能是可能的; 特別是在 Linux 上, /proc偽文件系統非常有用。 但是您需要先明確您的確切要求,然后我們才能為后一部分提供幫助。

如果您必須考慮 Windows 情況才能跨平台,請嘗試以下操作:

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

如果你有killall:

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

或者:

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

這在 Windows 7 中對我有用

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

你可以試試這個。 但你需要之前安裝psutil使用sudo pip install psutil

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

使用Process獲取流程對象。

>>> import psutil
>>> p = psutil.Process(23442)
>>> p
psutil.Process(pid=23442, name='python3.6', started='09:24:16')
>>> p.kill()
>>> 

下面的代碼將殺死所有面向 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)

您可以使用 WMI 模塊在 Windows 上執行此操作,盡管它比您使用 Unix 的人習慣的要笨重得多; import WMI需要很長時間,並且在這個過程中會有一些痛苦。

如果您想終止帶有特定標題的進程或 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 ) 

希望能幫助到你。 他們可能是我的許多更好的解決方案。

9代表SIGKILL信號。 所以你可以用KILL代替9

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

0r

os.sytem("kill -KILL 1234")
import os
os.popen("kill -9 $(ps aux | grep  " + processname + " | awk '{print $2}')")

Alex Martelli 的答案在 Python 3 中不起作用,因為out將是一個 bytes 對象,因此會導致TypeError: a bytes-like object is required, not 'str'在測試if 'iChat' in line:

引用子流程文檔

通信()返回一個元組(stdout_data,stderr_data)。 如果流以文本模式打開,則數據將是字符串; 否則,字節。

對於 Python 3,這是通過向Popen構造函數添加text=True (>= Python 3.7) 或universal_newlines=True參數來解決的。 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)

與 Giampaolo Rodolà 的回答風格相同,但作為一個襯墊,不區分大小寫,無需匹配整個進程名稱,在 Windows 中,您必須包含.exe后綴。

[x.kill() for x in psutil.process_iter() if 'ichat' in x.name().lower()]

您可以使用psutil模塊使用其名稱來psutil進程。 在大多數情況下,這應該是跨平台的。

import traceback

import psutil


def kill(process_name):
    """Kill Running Process by using it's name
    - Generate list of processes currently running
    - Iterate through each process
        - Check if process name or cmdline matches the input process_name
        - Kill if match is found
    Parameters
    ----------
    process_name: str
        Name of the process to kill (ex: HD-Player.exe)
    Returns
    -------
    None
    """
    try:
        print(f'Killing processes {process_name}')
        processes = psutil.process_iter()
        for process in processes:
            try:
                print(f'Process: {process}')
                print(f'id: {process.pid}')
                print(f'name: {process.name()}')
                print(f'cmdline: {process.cmdline()}')
                if process_name == process.name() or process_name in process.cmdline():
                    print(f'found {process.name()} | {process.cmdline()}')
                    process.terminate()
            except Exception:
                print(f"{traceback.format_exc()}")

    except Exception:
        print(f"{traceback.format_exc()}")

我基本上擴展了@Giampaolo Rodolà 的回答

  • 添加異常處理
  • 添加檢查以查看 cmdline

我也發布了這個片段作為要點

注意:一旦您對觀察到所需的行為感到滿意,您就可以刪除打印語句。

對我來說,唯一有效的是:

例如

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

您可以像這樣從python發出確切的命令

import os 
print os.system('kill -9 ' + pid)

但是您獲取pid的命令雖然需要一些工作(不能僅僅因為它具有iChat而確實是iChat),但是您應該使用Matthew Flaschen建議的killall來代替

您可以在 unix 系統中使用pkill <process_name>按名稱殺死進程。

然后python代碼將是:

>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)
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)
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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM