@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.) генерятся эти процессы. Сам автор программы задачу не осилил, поэтому сбросил её на меня :)
  • Вопрос задан
  • 302 просмотра
Решения вопроса 2
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, это тоже вероятный кандидат.
Ответ написан
leahch
@leahch Куратор тега Linux
3D специалист. Dолго, Dорого, Dерьмово.
Посмотреть, что происходит с программой можно через lsof -p PID-процесса, если это линукс.

Также можно через gdb подключиться к процессу - https://wiki.python.org/moin/DebuggingWithGdb
и есть еще pyrasite https://gist.github.com/reywood/e221c4061bbf2eccea...

PS. Если ничего не помогает, то можно воспользоваться strace -p PID
Но в системе его желательно включить командой # echo 0 > /proc/sys/kernel/yama/ptrace_scope
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Вопрос: существует ли какая-нибудь утилита, которая будет писать лог типа:
Зачем утилита, если сама программа может писать в журнал?

Сам автор программы задачу не осилил, поэтому сбросил её на меня :)
А сам не можешь найти места, которые обращаются к СУБД и прочим ресурсам, и, в добавок, создают процессы? Найдя их, пиши в журнал.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы