Задать вопрос
@ZlobniyShurik

При каких обстоятельствах запущен данный процесс python-программы?

Уважаемые, что почитать, какие инструменты посмотреть/поставить.

Суть проблемы, есть некая работающая python-программа. При длительной работе у неё начинает расти количество запущенных процессов. Условно, +50 процессов в сутки. Иногда количество запущенных процессов падает на 1-2-3, но в среднем наблюдаю устойчивый рост их числа (смотрю через `htop` и `systemctl status servicename`). И так до тех пор, пока не будут съедены все наличные ресурсы и сервер не встанет колом.

Вопрос: существует ли какая-нибудь утилита, которая будет писать лог типа:
"01.01.2024 12:34:56 started process by ConnectToDb() function"
"01.01.2024 13:12:11 closed process by ConnectToDb() function"
"01.01.2024 13:30:43 started process by CreateNetworkSocket() function"
...

Задача - хотя бы понять в каком примерно месте программы (работа с сетью/БД/e.t.c.) генерятся эти процессы. Сам автор программы задачу не осилил, поэтому сбросил её на меня :)
  • Вопрос задан
  • 339 просмотров
Подписаться 2 Средний 5 комментариев
Решение пользователя Vindicar К ответам на вопрос (3)
Vindicar
@Vindicar
RTFM!
Я бы попробовал использовать аудит-хук.
Многие функции питона генерят события аудита, на которые можно подписаться.
Есть полная таблица событий для CPython, но тебя будут интересовать события типа subprocess.Popen, os.system, os.spawn, os.startfile, os.exec, os.fork и так далее.
Внутри хука можешь попробовать вызвать traceback.format_stack() чтобы узнать текущий стек вызовов, и записать его в какой-нибудь журнал работы.
import sys
import traceback
# хук который ловит событие импорта модуля
def hook(event, args):
    if event != 'import':
        return
    name, filename = args[0], args[1]
    callstack = traceback.extract_stack(limit=None)
    print(event, name, filename)
    for item in traceback.format_list(callstack):
        print('    ', item.strip())

sys.addaudithook(hook)

import json

print('Done')


Это сработает только если процессы спавнятся средствами питона, а не каким-нибудь скомпилированным расширением.

Также можешь поискать использование модуля multiprocessing, это тоже вероятный кандидат.
Ответ написан