我不能为这个问题做一个可重复的例子;请仔细检查我的逻辑是否有误解,或者我是否遗漏了什么。
我正在尝试编写一个脚本来检查应该不断运行的 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
如何工作的理解。知道它是什么以及如何解决它吗?
'psutil.pids((' 的文档说:
返回当前正在运行的 PID 的列表。要遍历所有进程并避免竞争条件,应首选process_iter((。
因此,听起来您的流程正在生成的pids
列表和您在迭代期间到达该项目之间退出。
您可能想使用psutil.process_iter
它说:
返回一个迭代器,为本地计算机上所有正在运行的进程生成一个 Process 类实例。每个实例只创建一次,然后缓存到内部表中,每次生成元素时都会更新该表。将检查缓存进程实例的身份,以便在 PID 被另一个进程重用时安全,在这种情况下,将更新缓存的实例。