【问题标题】:How to check if a new process started in windows?如何检查Windows中是否启动了新进程?
【发布时间】:2021-07-22 05:15:32
【问题描述】:

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

我的第一个想法是在 python 中使用 psutil 并使用 sched 检查后台进程中的进程数,使其每 5 秒检查一次。

但是,获取新进程的进程 ID 有点复杂,因为我必须保存所有正在运行的进程的列表,并在五秒钟后将其与新列表进行比较。然后找出差异,获取新进程的id。

这似乎真的无效。

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

提前致谢。

【问题讨论】:

  • 如果将进程 ID 列表转换为 python set 对象,则可以通过单个函数调用将新集与旧集进行比较。您的“非常无效”的方法大约需要一行代码。
  • 你认为如果我每 5 秒比较两组与 300 多个对象,它不会减慢系统速度?也许没关系,因为只有大约 300 个对象。听听是否有更有效的方法来处理这个问题仍然很有趣。
  • 当然会:-)。您运行的任何程序都会为其他程序减慢系统速度。但是您说的是在以千兆赫兹速度运行的处理器上进行 300 次整数比较。仅仅刷新屏幕就需要数百万次操作,而所需的时间对用户来说是不明显的。
  • 我发现psutil.process_iter()对象生成器中有一个开始时间信息。所以我的新想法是在进程开始时间列表中搜索当前时间的间隔,以获取最近启动的 pcId。我仍然觉得应该有更好的方法来做到这一点。
  • 注册以获得有关进程创建和终止的通知。例如,WMI 可用于此目的。

标签: python windows process psutil


【解决方案1】:

嗯,这是一个完整的工作程序,完全符合您的要求。从开始到结束,开发时间大概是 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)

【讨论】:

    【解决方案2】:

    感谢您的回答。

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

    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, 1, checkNewProc)
    
    event_schedule.run()
    

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

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

    【讨论】:

      【解决方案3】:

      这就是我要找的东西

      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。

      【讨论】:

        猜你喜欢
        • 2013-09-17
        • 1970-01-01
        • 1970-01-01
        • 2013-05-18
        • 2018-07-26
        • 1970-01-01
        • 1970-01-01
        • 2015-06-18
        • 1970-01-01
        相关资源
        最近更新 更多