遍历进程列表以检查 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 name
或 ps -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:
我正在创建一个 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 name
或 ps -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: