Windows系统中如何监听进程活动 无需遍历即可触发状态变化回调?
进程启动/终止事件被动监控实现方案
不同操作系统内核都提供了进程事件的通知机制,无需轮询遍历所有进程,以下是分平台的实现方式:
Windows 平台
使用WMI的事件订阅机制监听进程创建/销毁事件,依赖pywin32库:
- 安装依赖:
pip install pywin32 - 示例代码:
import win32com.client import pythoncom def on_process_created(sender, event): # 匹配目标进程名,触发自定义逻辑 if event.Properties_('Name').Value.lower() == 'target.exe': print(f"目标进程启动,PID:{event.Properties_('ProcessId').Value}") # 此处执行你需要的指定代码 def on_process_deleted(sender, event): if event.Properties_('Name').Value.lower() == 'target.exe': print(f"目标进程终止,PID:{event.Properties_('ProcessId').Value}") # 此处执行你需要的指定代码 pythoncom.CoInitialize() wmi = win32com.client.GetObject("winmgmts:") # 订阅进程创建事件 wmi.ExecNotificationQueryAsync( win32com.client.WithDispatch(on_process_created), "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'" ) # 订阅进程销毁事件 wmi.ExecNotificationQueryAsync( win32com.client.WithDispatch(on_process_deleted), "SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'" ) # 保持事件监听循环 while True: pythoncom.PumpWaitingMessages()
注意:WITHIN参数是事件检测的最大延迟,单位秒,设置越小响应越及时,最低可设为0
Linux 平台
可通过eBPF挂载内核tracepoint实现零轮询的进程事件监听,依赖bcc库(也可使用更轻量的pyebpf绑定):
- 安装依赖:
apt install bcc python3-bcc( Debian/Ubuntu 系) - 核心逻辑是监控
sched_process_exec(进程启动)和sched_process_exit(进程退出) tracepoint,匹配到目标进程名时触发回调,整体内核态开销低于1%。
如果不想依赖eBPF,也可以通过netlink的proc事件连接器监听进程事件,无需root权限即可使用。
跨平台低开销替代方案
如果需要兼容多系统不想做平台适配,可以对psutil轮询方案做优化,将全量进程属性遍历改为仅对比PID集合增量:
import psutil import time last_pids = set() target_name = "target.exe" while True: current_pids = set(psutil.pids()) # 仅处理新增的PID new_pids = current_pids - last_pids for pid in new_pids: try: p = psutil.Process(pid) if p.name().lower() == target_name: print(f"目标进程启动,PID:{pid}") # 执行自定义逻辑 except (psutil.NoSuchProcess, psutil.AccessDenied): pass # 仅处理消失的PID del_pids = last_pids - current_pids for pid in del_pids: # 可匹配缓存的进程名判断是否是目标进程退出 pass last_pids = current_pids time.sleep(0.5)
该方案相比全量遍历所有进程属性,性能可提升10~20倍,大部分场景下足够使用。
内容的提问来源于stack exchange,提问作者Aspecky
相关产品推荐
相关产品推荐

