Я создаю Python программу для контроля процессов на сервере один раз в час, чтобы посмотреть, сможет ли он вернуть PID. Для этого я создал функцию, которая использует подпроцесс для вызова pgrep -f для любого имени, переданного ему. Если он возвращает процесс, функция оценивается как true; в противном случае он возвращает 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)
Затем я устанавливаю для l oop значение, чтобы он повторял список имен процессов (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? Я читаю, что это должно быть использовано над подпроцессом, но я не могу найти в любом случае специально mimi c pgrep -f name
или ps -aux | grep name
. Это важно, так как у меня на компьютере запущено несколько приложений Java, а имя программы, которое psutil, похоже, всегда видело, было java, а не ProfileService.