Перебор списка процессов для проверки наличия PID с подпроцессом Python - PullRequest
0 голосов
/ 09 марта 2020

Я создаю 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.

Ответы [ 2 ]

2 голосов
/ 09 марта 2020

Вы не используете результат функции, вы проверяете, является ли сама функция check_essentials False.

Что это не так, потому что это функция.

1 голос
/ 09 марта 2020

Вам нужен результат check_essentials в вашем состоянии, check_essentials всегда True, потому что это Python объект:

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