如何使用python杀死资源消耗不变的Windows进程?

Posted

技术标签:

【中文标题】如何使用python杀死资源消耗不变的Windows进程?【英文标题】:How to kill windows processes whose resource consumption doesn't change using python? 【发布时间】:2018-08-05 16:36:20 【问题描述】:

我有一个 python 脚本,可以测试我的 windows 机器上是否正在运行任何 firefox 进程,然后杀死它们:

import os, subprocess
running_processes = subprocess.check_output('tasklist', shell = True)
if "firefox.exe" in running_processes:
    os.system("TASKKILL /F /IM firefox.exe")

我只想杀死内存消耗和 CPU 使用率随时间保持不变(即在特定时间间隔内不发生变化)的 firefox 进程。

如何在 python 中杀死具有恒定内存和 CPU 使用率的 windows 进程?

【问题讨论】:

这个(psutill)库可能会帮助你pypi.python.org/pypi/psutil 【参考方案1】:

我当前杀死陈旧 Windows 进程的方法涉及一个函数,该函数为每个正在运行的进程返回一个(进程 PID / 进程内存消耗)元组。

如果元组在两个连续的函数调用之间没有变化,我会通过 PID 终止进程。这种方法有一个局限性:需要提前知道(命名)要监控的过程。

import os, subprocess, csv, psutil, time
def get_task_memory(process_name):
    running_processes = csv.DictReader(              # Get list of running processes
                             subprocess.check_output(
                             \"tasklist /fo csv\").splitlines()) 
    PID_list = []
    memory_A = []
    for task in running_processes:                   # Loop through running processes
        if process_name in task.values():
            PID = int(task.values()[2])              # Get process PID
            consumption = task.values()[1]           # Get memory usage of process with PID
            PID_list.append(PID)                     # Create list of PIDs
            memory_A.append(consumption)             # Create list of memory usage
    process_snapshot = zip(PID_list, memory_A)       # Create list of PID:memory usage tuples
    return process_snapshot                          # return tuple for every running process

在无限循环中,我连续调用此函数,中间有短暂的中断。如果任何进程特定的元组在运行中是相同的,则相应进程的内存消耗不会改变 - 现在可以通过 PID 终止该进程。

while True:  
    process_name = "phantomjs.exe"                     # PName of process to be monitored
    process_snapshot_A = get_task_memory(process_name) # function call 1
    time.sleep(n)                                      # Wait
    process_snapshot_B = get_task_memory(process_name) # function call 2
    stale_processes = [tuple for tuple in process_snapshot_A if tuple in process_snapshot_B]
    if len(stale_processes) > 0:                       # Stale processes 
        print "stale process found - terminating"
        for PID, memory in stale_processes:            
            stale_process = psutil.Process(PID)        # Get PID
            stale_process.kill()                       # Kill PID
    else:
        pass

【讨论】:

以上是关于如何使用python杀死资源消耗不变的Windows进程?的主要内容,如果未能解决你的问题,请参考以下文章

nexus 消耗大量cpu资源,启动一堆僵尸进程

window端口占用如何杀死进程

linux kill 关闭进程命令

xlsxwriter 消耗太多内存并且进程被杀死

主进程被杀死时,如何保证子进程同时退出,而不变为孤儿进程

讲清楚,说明白!进程管理