【问题标题】:Iterating through list of processes to check if PID exists with Python subprocess遍历进程列表以检查 Python 子进程是否存在 PID
【发布时间】:2020-03-09 14:45:11
【问题描述】:

我正在创建一个 Python 程序来每小时监控一次服务器上的进程,以查看它是否可以返回 PID。为此,我创建了一个函数,该函数使用 subprocess 对提交给它的任何名称调用 pgrep -f。如果它返回一个进程,则该函数评估为真;否则返回 false。

import subprocess
import psutil


def check_essentials(name):
    child = subprocess.Popen(['pgrep', '-f', name], stdout=subprocess.PIPE, shell=False)
    response = child.communicate()[0]
    pid = response.split()
    if len(pid) == 0:
        print("unable to find PID")
        return False
    else:
        print("PID is %s" % pid)
        return True

essentialApps = ['ProfileService','aflaf']
sendEmail=False

for x in essentialApps:
    check_essentials(x)
    if check_essentials == False:
        print("Unable to find PID for %s. Sending email alert" % x)
        sendEmail = True
    else:
        print("Found PID for %s" % x)

然后我设置了一个 for 循环,让它遍历进程名称列表 (essentialApps) 并查看它是否可以为它们返回任何内容。如果不是,则将 sendEmail 设置为 true。

然而,在测试这一点时,我发现 else 语句总是被调用,无论应用程序是否存在。当我调用这个程序 (python alert.py) 时,我得到以下输出:

PID is [b'11111']
Found PID for ProfileService 
unable to find PID #This is expected
Found PID for aflaf #This should be "Unable to find PID for aflaf"

我确信这很简单,但谁能告诉我为什么它没有正确评估 check_essential?

另外,有没有办法用 psutil 做到这一点?我正在阅读这应该用于子进程,但无论如何我都无法找到专门模仿pgrep -f nameps -aux | grep name。这很重要,因为我在机器上运行了多个 Java 应用程序,而 psutil 似乎看到的程序名称始终是“java”,而不是“ProfileService”。

【问题讨论】:

    标签: python if-statement subprocess monitoring psutil


    【解决方案1】:

    您没有使用函数的结果,而是在检查 check_essentials 函数本身是否为 False

    它不是,因为它是一个函数。

    【讨论】:

    • 默认情况下说所有 Python 对象 都是真实的 是正确的(并且可以被覆盖以不这样做,例如大多数序列都是)。然而,他们没有评估为真,这里check_essentials == True 也不会通过。尽管将值传递给 bool 将产生 True(因为 bool 将真实性转换为实际布尔值)。
    【解决方案2】:

    你需要check_essentials在你的条件下的结果,check_essentials总是True,因为它是一个Python对象:

    for x in essentialApps:
        check_result = check_essentials(x)
        if check_result == False:
    

    【讨论】:

    • 这似乎按预期工作 - 我没有看到这一点感到很愚蠢。谢谢!
    猜你喜欢
    • 2011-03-03
    • 2012-02-27
    • 2010-10-08
    • 2014-03-06
    • 2021-11-08
    • 2015-12-23
    • 1970-01-01
    • 2020-06-01
    相关资源
    最近更新 更多