遍历进程列表以检查 PID 是否存在 Python 子进程

Iterating through list of processes to check if PID exists with Python subprocess

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

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),看看它是否可以 return 为它们做任何事情。如果不是,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'.

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

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

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

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