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

如何获取系统运行进程的终止时间并在进程终止时触发信号?

实现进程终止时的通知/信号触发

你目前使用psutil和wmi能获取进程创建时间,但需要在进程终止时触发信号,以下是两种可行方案:

方案1:psutil轮询监控(跨平台)

通过定期检查指定进程是否存活,一旦检测到进程终止,立即执行自定义操作(比如发送信号、记录日志等),该方案支持Windows、Linux、macOS全平台。

代码示例

import psutil
import time
from datetime import datetime

def monitor_process(pid, on_terminate):
    """
    监控指定PID的进程,终止时调用回调函数
    :param pid: 要监控的进程ID
    :param on_terminate: 进程终止时执行的回调逻辑
    """
    try:
        process = psutil.Process(pid)
        # 获取进程创建时间(复用原有逻辑)
        create_time = datetime.fromtimestamp(process.create_time()).strftime("%d-%m-%Y %H:%M:%S")
        print(f"开始监控进程PID {pid},创建时间:{create_time}")
        
        while True:
            if not process.is_running():
                terminate_time = datetime.now().strftime("%d-%m-%Y %H:%M:%S")
                on_terminate(pid, terminate_time)
                break
            # 可根据需求调整检查间隔,间隔越小实时性越高
            time.sleep(1)
    except psutil.NoSuchProcess:
        print(f"进程PID {pid} 不存在")

def handle_terminate(pid, terminate_time):
    """进程终止时的自定义处理逻辑"""
    print(f"进程PID {pid} 已终止,终止时间:{terminate_time}")
    # 此处可添加信号发送逻辑,比如调用API、触发本地通知、发送邮件等

# 示例:监控PID为264的进程
if __name__ == "__main__":
    target_pid = 264
    monitor_process(target_pid, handle_terminate)

扩展说明

  • 若需批量监控多个进程,可维护一个PID集合,循环遍历检查每个进程的存活状态
  • 轮询间隔可根据业务需求调整,平衡实时性与资源占用

方案2:WMI事件监听(Windows专属)

Windows平台可利用WMI的__InstanceDeletionEvent事件直接监听进程终止,无需主动轮询,系统事件触发的方式实时性更强。

代码示例

import wmi
from datetime import datetime

def monitor_process_termination():
    """监听所有进程终止事件"""
    c = wmi.WMI()
    # 监听Win32_Process的删除事件
    watcher = c.watch_for(
        notification_type="__InstanceDeletionEvent",
        wmi_class="Win32_Process",
        delay_secs=1
    )
    
    print("开始监听进程终止事件...")
    while True:
        event = watcher()
        pid = event.ProcessId
        terminate_time = datetime.now().strftime("%d-%m-%Y %H:%M:%S")
        print(f"进程PID {pid} 已终止,终止时间:{terminate_time}")
        # 此处添加自定义信号发送逻辑

# 若需过滤特定进程,可添加WQL条件,比如监控notepad.exe:
# watcher = c.watch_for(
#     notification_type="__InstanceDeletionEvent",
#     wmi_class="Win32_Process",
#     condition="Name='notepad.exe'",
#     delay_secs=1
# )

if __name__ == "__main__":
    monitor_process_termination()

关键说明

运行中的进程不存在终止时间,只有在进程终止的瞬间才能捕获并记录终止时刻,上述两种方案都是在进程终止的节点触发操作,同时记录终止时间。

内容的提问来源于stack exchange,提问作者ayush

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 21:50:20