psutil进程未运行,重用或死亡或僵尸

时间:2014-04-01 11:59:28

标签: python process psutil

psutil.process_iter()包含什么?因为,它是一个缓存的实例,它是否只包含当时正在运行的进程,或者它包含所有内容并使其当前状态为用户验证?我的代码:

for _process in psutil.process_iter():
    try:
        new_proc = _process.as_dict(attrs=['cpu_times', 'name', 'pid', 'status'])
    except psutil.NoSuchProcess:
        continue

这里过滤了所有状态?我需要自己验证什么呢?

2 个答案:

答案 0 :(得分:0)

The docs for psutil.process_iter() say

  

返回一个迭代器,为所有运行生成一个Process类实例   本地机器上的进程。每个实例只创建一次,然后缓存到内部表中,每次生成元素时都会更新。 强调是我的

其中"跑步"由.is_running() method定义,为僵尸进程返回True。即使进程已经消失并且其pid被重用,.is_running()也可以安全使用。

我的理解是_process.is_running()psutil.process_iter()产生它的时候是真的。原则上,在_process.as_dict返回信息之前,可能会发生以下几种情况:

  1. 流程可能会死亡 - 变成僵尸:_process.is_running()为真,pidstatus有意义
  2. 可能会被收获 - 死亡:进程信息不可用(psutil.NoSuchProcess例外)或过时(如果缓存)
  3. 其pid可能会被重复使用 - 某些_process方法可能会错误地返回 new 进程的信息。 .is_running()使用多个流程属性,因此它应该在重用pid时检测到这种情况。
  4. 通常情况下,操作系统不会立即重用pid,因此p.3不应经常发生。

答案 1 :(得分:0)

psutil.process_iter()遍历系统中所有正在运行的进程。 ZombieProcess错误通常在MacOS中出现,解决方法可能是在except psutil.ZombieProcess:例外的情况下处理该错误

for _process in psutil.process_iter():
    try:
        new_proc = _process.as_dict(attrs=['cpu_times', 'name', 'pid', 'status'])
    except psutil.NoSuchProcess:
        continue
    except psutil.ZombieProcess:
        continue