psutil返回已停止警告的模块

时间:2018-01-18 16:58:54

标签: python

我不能为这个问题做一个可重复的例子;请仔细检查我的误解逻辑,或者我是否遗漏了某些东西。

我正在尝试编写一个脚本来检查应该持续运行的python应用程序,如果它已经停止工作,请给我发一封电子邮件。我正在使用psutil来检查正在运行的进程。这是我的功能,用于检查相关程序是否正在运行(我定期调用此功能)。

def programRunning():
    cmdLines = []

    for pid in psutil.pids():
            p = psutil.Process(pid)
            if p.name() == "pythonw.exe":
                    cmdLines.append(p.cmdline()[-1])
           #scheduler.py is my script
    if any('scheduler' in process for process in cmdLines):
        return True  
    else:
        return False

现在,我的主程序产生了一个错误并停止了运行,但是这个功能仍在True中,正如cmdLines list我得到的那样(其中包括):

['C:\\Users\\..omitted..\\scheduler.py', ..omitted..]

所以我很清楚我对psutils如何运作的理解。知道它是什么以及如何解决它?

1 个答案:

答案 0 :(得分:0)

`psutil.pids()的docs说:

  

返回当前运行的PID列表。要迭代所有进程并避免竞争条件,应首选process_iter()。

所以听起来您的流程正在生成的pids列表之间退出,并且您在迭代期间到达该项目。

您可能希望使用psutil.process_iter,其中包含:

  

返回一个迭代器,为本地计算机上的所有正在运行的进程生成一个Process类实例。每个实例只创建一次,然后缓存到内部表中,每次生成一个元素时都会更新。检查高速缓存的进程实例的身份,以便在另一个进程重用PID时保证安全,在这种情况下更新高速缓存的实例。