Скрипт Python для мониторинга процесса и подпроцессов

У меня есть скрипт Python, который отслеживает процесс и его подпроцессы для использования ЦП и памяти процессом.

Сценарий постоянно проверяет, является ли процесс или один из его подпроцессов Active. Когда процесс и все его подпроцессы переходят в состояние Inactive, скрипт Python завершает работу.

Итак, проблема, с которой я сталкиваюсь здесь для конкретного процесса, заключается в следующем:

  1. Процесс начинается
  2. Процесс создает подпроцесс-1
  3. Процесс создает подпроцесс-2
  4. Процесс создает подпроцесс-3 (в последний момент Active)
  5. Завершить подпроцесс-3 (На данный момент процесс и все его подпроцессы имеют статус Inactive)
  6. Процесс создает подпроцесс-4 (в последний момент Active)

Итак, если мой скрипт проверяет, является ли процесс или один из подпроцессов Active в [5], он возвращает false и завершается!

Вкратце: существует короткий промежуток времени, когда процесс и все его подпроцессы находятся в состоянии Inactive (т. е. время между уничтожением подпроцесса и появлением нового подпроцесса). Если мой скрипт проверяет статус в этот момент времени, он возвращает false, потому что все неактивно.

Может ли кто-нибудь предоставить мне какое-либо решение или решить эту проблему?

while(bIsProcessActive == True):
    bIsProcessActive = False
    if (proc.is_running() and proc.status != psutil.STATUS_ZOMBIE):
        bIsProcessActive = True
        cpu_usage = proc.get_cpu_percent(interval = 2)
        memory_usage = proc.get_memory_info().rss
    for child in proc.get_children():
        if child.is_running() and child.status != psutil.STATUS_ZOMBIE:
            // Add to memory and CPU usage of parent process
            if bIsProcessActive == False and childutilization[0] == True:
                bIsProcessActive = True

person Anwar Shaikh    schedule 11.06.2015    source источник
comment
Посмотрите, как supervisord, systemd, upstart, runit реализованы   -  person jfs    schedule 12.06.2015


Ответы (1)


Поскольку в вашем процессе могут быть дочерние элементы, пережившие смерть родителя, вы не можете эффективно отслеживать дочерние элементы, основываясь исключительно на родительской информации, поскольку родительский идентификатор для дочернего элемента становится равным 1 при выходе родителя - если вам не удалось получить дочерний идентификатор раньше смерть родителя, вы не можете найти его больше.

Один из способов решить эту проблему — использовать вместо этого идентификатор группы процессов (pgid): процесс и все его потомки будут иметь один и тот же pgid. Работает только в том случае, если потомки не трансформируются в лидеров группы процессов, поэтому, если предположить, что это верно в будущем.

Имея это в виду, вы всегда можете сканировать запущенные процессы и находить дочерние процессы, даже если родительский процесс больше не выполняется.

Это может помочь, если сам сценарий мониторинга станет лидером группы процессов - ограничит pgid только его потомками.

Смотреть на:

  • os.setpgrp()
  • os.getpgrp()
  • ps -eo pid,ppid,pgid

Я использовал этот метод в сценарии мониторинга для инструмента анализа сборки ПО под названием BuildIn, вы можете просмотреть его здесь: https://buildin.apartsw.com/wrap.html. Извините за рекламу

person Dan Cornilescu    schedule 11.06.2015
comment
Спасибо Дэн! Ваш вклад, безусловно, поможет мне сделать сценарий более надежным. - person Anwar Shaikh; 12.06.2015
comment
Но текущая проблема, с которой я сталкиваюсь, заключается в том, что существует короткий промежуток времени, когда процесс и все его подпроцессы находятся в неактивном состоянии (т.е. время между уничтожением подпроцесса и новым подпроцессом еще не создано). Если мой скрипт проверяет активный статус в этот момент времени, он возвращает false. - person Anwar Shaikh; 12.06.2015
comment
Реализация где-то неверна, поскольку, судя по вашему описанию, родитель все еще работает в этот момент (иначе он не мог бы запустить новый дочерний процесс позже) - поэтому он должен возвращать true. Или описание не отражает того, что происходит на самом деле. - person Dan Cornilescu; 12.06.2015
comment
Я склонен думать, что происходит то, что есть дочерние процессы, порожденные после вызова proc.get_children() в итерации last, в которой родитель все еще жив, - это именно те, которые вы больше не можете найти, о которых я упоминал в своем ответе. - person Dan Cornilescu; 12.06.2015