微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何检查新进程是否在 Windows 中启动?

如何解决如何检查新进程是否在 Windows 中启动?

我正在尝试编写一个程序,每当新进程启动时都会通知我。

我的第一个想法是在 python 中使用 psutil 并使用 sched 检查后台进程中的进程数,让它每 5 秒检查一次。 但是,获取新进程的进程 ID 有点复杂,因为我必须保存所有正在运行的进程的列表,并在五秒后将其与新列表进行比较。然后找出差异并获取新进程的 id。 这似乎真的很无效。

有没有人知道一种更有效的方法来检查新进程并在它们启动时获取其进程 ID?我想最好的方法是学习如何在 windows api 中做到这一点,但 python 会容易得多。

提前致谢。

解决方法

嗯,这是一个完整的、可运行的程序,它完全符合您的要求。从开始到结束,开发时间大概是 5 分钟。根据 psutil 文档,它应该可以在任何支持 python 的操作系统上运行。

我使用的是 Windows,所以我打开了任务管理器并观察了该程序的 CPU 使用率。它几乎总是零。偶尔我会看到一个很小的值,从不超过 3%。

我确信有一种方法可以减少执行时间,例如,请参阅 IInspectable 的评论。鉴于 python 和 psutil 提供的开发便利性,这值得吗?您是否关心性能改进是否会破坏跨平台兼容性?当然,只有你才能回答这些问题。但除非您对浪费几个 CPU 周期非常敏感,否则我会选择最简单的解决方案并转向其他解决方案。

#! python3.8

import time

import psutil

old_set = set(list(psutil.process_iter()))
while True:
    new_set = set(list(psutil.process_iter()))
    added = new_set - old_set
    for p in added:
        print("New",p)
    old_set = new_set
    time.sleep(5.0)
,

感谢您的回答。

我自己很快想到的解决方案是

import psutil
import sched
import time

def checkNewProc():
    for p in psutil.process_iter():
    #print(p.create_time())
        epoch_time =int(time.time())
        if abs(p.create_time()- epoch_time)<2:
            print(p.name(),p.pid)
            
    event_schedule.enter(2,1,checkNewProc)

event_schedule.enter(2,checkNewProc)

event_schedule.run()

我尝试这样做的主要原因是对管理流程有更深入的了解。因此,像来自 IInspectable 的答案是我正在寻找的,以学习在更深层次上做这些事情的新方法。 我不太关心处理时间。

所以我仍然对不同的方法持开放态度。

,

这正是我要找的

import wmi

c = wmi.WMI()
process_watcher = c.Win32_Process.watch_for("creation")
while True:
    new_process = process_watcher()
    print(new_process.Caption,process.ProcessId)

谢谢。我不知道 WMI。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。