【问题标题】:Killing processes with psutil使用 psutil 杀死进程
【发布时间】:2012-08-16 14:23:01
【问题描述】:

我正在寻找编写一些代码来根据进程的名称和拥有者来终止进程。这在 Windows XP 上运行良好,但是当我在 Windows 7 上运行相同的代码时,在尝试获取进程的用户名时出现访问被拒绝错误。

有没有更简单的方法可以杀死在 XP 和 Win7 上运行的进程?

实际上需要检查进程是否为“SYSTEM”所有,因此我可以检查进程何时完成用户进程,因为 SYSTEM 进程仍然存在,我不关心这个。

PROCNAME = 'python.exe'
for proc in psutil.process_iter():
  if proc.name == PROCNAME:
    p = psutil.Process(proc.pid)
  
    if not 'SYSTEM' in p.username:
      proc.kill()

【问题讨论】:

  • 在 XP 上杀死 SYSTEM 进程也会失败并显示拒绝访问。
  • 你能从任务管理器中杀死SYSTEM进程吗?
  • 是的,也来自 taskkill,但我需要能够扫描进程列表并找出该进程是 SYSTEM 进程还是 USER 进程,并且我还在检查 USER在我清理任何其他实例之前,进程已经完成。

标签: python windows-7 windows-xp


【解决方案1】:

如果您没有使用 PSUTIL 杀死进程的权限,那么您将不会使用 其他任何方法 来杀死它。首先想到的显然是UAC,它恰好出现在 XP 和 Windows 7 之间。这意味着您的 PSUTIL 必须从提升的提示符下运行,这不足为奇。将清单添加到request elevation

【讨论】:

  • 我确实在 Windows 7 机器上关闭了 UAC。这还不够吗?理想情况下,我想要最简单的解决方案。
【解决方案2】:

从 2010 年 10 月开始 (see issue 114),username 是使用 C 函数调用获得的(参见 source 中的 get_process_username

这意味着它遇到了this previous stackoverflow question中描述的问题

基本上您可以捕获AccessDenied 异常并假设用户是“SYSTEM”或“LOCAL SERVICE”

编辑:据我所见,Python 中还有一个错误,它导致的 AccessDenied 错误多于应有的错误。 psutil 中的SetSeDebug 函数最后调用RevertToSelf,实际上恢复了它所做的所有更改。

【讨论】:

    【解决方案3】:

    问题是某些进程没有名称,因此您会收到错误。

    如果你把它放在一个 try 块中它会起作用:

    PROCNAME = 'python.exe'
    for proc in psutil.process_iter():
      try:
          if proc.name == PROCNAME:
          p = psutil.Process(proc.pid)
    
          etc..
      except:
        pass
    

    【讨论】:

    • 这不是问题。如果是这样,user1351549 将获得 AttributeError 而不是 AccessDenied 异常。另外,请不要使用裸except:
    【解决方案4】:

    这只是一个猜测,但也许 UAC 正在阻止 Python 拥有管理员权限。尝试在 Win 7 上使用“以管理员身份运行”的东西以管理员身份执行 Python(我不记得它的确切位置,但它可能涉及以管理员身份启动终端,这可以从“开始”菜单完成,然后执行你的Python 脚本)。

    【讨论】:

      【解决方案5】:

      如果 psutil 不起作用,您可以随时尝试通过 os.system 使用 taskkill(命令提示符) 杀死所有 excel 实例的示例:

      import os
      os.system("""taskkill /f /im excel.exe""")
      

      【讨论】:

        猜你喜欢
        • 2016-12-08
        • 1970-01-01
        • 1970-01-01
        • 2011-09-15
        • 1970-01-01
        • 2010-12-08
        • 1970-01-01
        相关资源
        最近更新 更多