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