You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 00:48:04