如何获取系统运行进程的终止时间并在进程终止时触发信号?
实现进程终止时的通知/信号触发
你目前使用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
相关产品推荐
相关产品推荐

