Форум сайта python.su
Есть консольное приложение, которое запускается несколько тысяч раз в сутки (реализует опросы совместно с Asterisk). Проблема заключается в том, что примерно раз-два в сутки экземпляр скрипта зависает и потребляет 100% процессора. Для отладки был добавлен следующий код, с расчетом на то, что при отправке SIGUSR1 зависшему процессу, в файле stack.log будет получена информация о выполняемом участке кода.
Проблема в том, что файл создается, но оказывается пустым. При запуске программы из консоли и отправки SIGUSR1 в файл записывается содержимое стека. В чем может быть проблема? Как можно ещё отлаживать приложение в такой ситуации?
import signal
import traceback
def handler(signum, frame):
filename = '/var/log/asterisk/stack.log'
stackfile = open(filename, 'a+')
stackfile.write(repr(traceback.format_stack()) % "\n")
stackfile.flush()
signal.signal(signal.SIGUSR1, handler)
Офлайн
Привет, Игорь.
Сейчас смоделировал два варианта:
1. Зациклился. В этом случае трейс нормально пишется в файл
2. Какая-либо встроенная конструкция делает тяжелый I/O. Попробовал читать /dev/zero :) но в этом случае он вообще по SIGUSR1 не создает файл
Так что ты попробуй логирование сделать в этом скрипте, чтобы каждый запуск начина лог заново, чтобы файл не пух…
P.S. В коде небольшая ошибка: вместо
stackfile.write(repr(traceback.format_stack()) % "\n")
stackfile.write('\n'.join(traceback.format_stack()))
Офлайн