Отладка: консольный вывод и сценарии обновления


16

Как вы посылаете вывод сценария выскочки на терминал так, чтобы найти tracebacks в питона коде? Мне постоянно нужно делать вещи без следов, которые раньше занимали всего секунду. Я должен сделать несколько вызовов записи файла, чтобы отследить ошибки. То, что произошло второй, чтобы найти, прежде чем с отслеживающим превращаются в несколько минутах минут. Это жалко Это продолжается уже несколько недель, и мне это надоело. Могут ли некоторые высказаться по этому вопросу, пожалуйста. Я чувствую, что снова использую сборку без отладчика.

Ответы:


27

Если вы используете Upstart 1.4 или новее, console logвключите его в задание Upstart, и весь вывод в stdout / stderr будет заканчиваться /var/log/upstart/<job>.log. Затем вы можете сделать , tail -f /var/log/upstart/<job>.log &чтобы иметь выход появится в терминале.


Как-то поздно на вечеринку, но этот ответ спас меня :) Также похоже, что это работает для меня без каких-либо специальных настроек в файле upstart conf. С моей стороны это должен быть принятый ответ.
— rslite

Не знал, что выскочили журналы управляемых сервисов /var/log/upstart. Действительно полезно, спасибо.
— Франциско

2

Существует целый раздел о методах отладки в Upstart Cookbook . Самое простое, что вы можете сделать, это добавить --debugаргументы вашего ядра, что увеличит многословность upstart и сбросит все в syslog. Да, отладка сложна, она отражает сложность сети, необходимую для создания параллельной системы инициализации. Я уверен, что есть место для улучшения.


2
поваренная книга не объясняет должным образом среду отладки новичку. Я видел подобные объяснения раньше. Есть или не хватает или делать предположения гуру. Это очень расстраивает людей, которые хотят добавить в сообщество и только начинают. Я никогда не сталкивался с программной средой, в которой не было строки кода, где возникает ошибка, за исключением сборки, где вы заново изобретаете колесо, чтобы его можно было простить.
— Bambuntu

Ну, что бы вы предложили тогда? Это открытый документ. Если у вас есть методика отладки, которая намного выше того, что там представлено, добавьте ее. Проблемы ОП в большей степени связаны с тем, что он не понимает, как управлять основными парадигмами Unix в его дополнительной среде выполнения по сравнению с контекстом, в котором он развернут. Просто потому, что вы используете python или [вставьте здесь причудливый язык среды выполнения], не означает, что вы можно игнорировать фундаментальную среду выполнения, UNIX.
— Ппетраки

2

Когда я пишу питона демон Я ловлю все исключения и бросить затем в лог-файл. Я использую не только для отладки, но и в производстве. У меня есть небольшой скрипт, который я запускаю каждое утро, который ищет что-то огорчающее в журналах.

Конечно, это также помогает поддерживать работу демона.

Пример кода (я удаляю не интересные части):

import logging

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(levelname)s %(message)s',
                    filename=LOG_FILE,
                    filemode='w')
    logging.info("Sincrod inicializado")
    if not DEBUG:
        daemonize()
    while True:
        try:
            actua()
        except:
            logging.error(sys.exc_info())
        if (datetime.datetime.now().hour > NOITE_EMPEZA\
         and datetime.datetime.now().hour < NOITE_REMATA):
            time.sleep(INTERVALO_NOITE)
        else:
            time.sleep(INTERVALO_DIA)

Где actua () - настоящий демон (он также пишет в журнал). Обратите внимание, что у меня также есть переменная DEBUG в файле настроек, когда она True, я не разветвляю демона, поэтому он запускается на консоли.

Демоны

Демоны - это Unix, эквивалентный службам Windows. Это процессы, которые работают в фоновом режиме независимо от других процессов. Это означает, что их отец обычно init, и они отделены от любого tty. Поскольку они независимы, нет предопределенного места для размещения их вывода.

Существует множество библиотек python и фрагментов кода для создания демона. В приведенном выше примере я использую свою собственную функцию, которая объединяет некоторые идеи из версий Steinar Knutsens и Jeff Kunces. Это настолько просто, насколько это возможно, учтите, что я разветвляюсь дважды .

def daemonize():
    """Forks this process creating a daemon and killing the original one"""
    if (not os.fork()):
        # get our own session and fixup std[in,out,err]
        os.setsid()
        sys.stdin.close()
        sys.stdout = NullDevice()
        sys.stderr = NullDevice()
        if (not os.fork()):
            # hang around till adopted by init
            ppid = os.getppid()
            while (ppid != 1):
                time.sleep(0.5)
                ppid = os.getppid()
        else:
            # time for child to die
            os._exit(0)
    else:
        # wait for child to die and then bail
        os.wait()
        sys.exit()

Ладно. поскольку вы уже регистрируетесь в системном журнале, просто отфильтруйте сообщения демона и выведите их на консоль. Я не понимаю, почему это характерно для выскочки? SysV init будет иметь ту же проблему.
— Ппетраки

Вы правы, это не характерно для выскочки, честно говоря, большинство моих серверов работают под управлением 8.04, не выскочка. Но это справедливо и для выскочки. OP спрашивал, как отлаживать скрипты Python с помощью upstart, а не метод, который работает только с upstart. Я не регистрируюсь в системном журнале, а в конкретном файле, и здесь уловка заключается в перехвате всех исключений и выводе трассировки стека в этот файл.
— Хавьер Ривера

ну, это просто управление stdout в зависимости от контекста, верно? Я знаю множество демонов unix, которые имеют эквивалентную многословность ведения журнала, независимо от того, подключен ли он к tty или функционирует как демон. Если бы это был Ruby, я бы переопределил или украсил бы метод базового класса, который исключения используют для вывода. Я уверен, что нечто подобное можно сделать в Python. Возможно, вам лучше задать этот вопрос по обмену стека. Это в большей степени основная проблема кодирования / проектирования демонов Unix, и, как вы сказали, она не имеет ничего общего со сценариями инициализации.
— Ппетраки

Я все еще знакомлюсь с жаргоном. Я предполагаю, что под демоном вы имеете в виду определенный сценарий, который выполняется в фоновом режиме. В вашем коде я просто поместил свой сценарий вместо actua (), чтобы получить обратные вызовы для этого вызова сценария? Есть ли способ направить его на консоль вместо файла?
— Bambuntu

1
Демоны в отдельном смысле обычно отсоединяются от tty, на котором они были запущены, закрывают свои оригинальные файловые дескрипторы для stdin, stdout и stdin и являются потомками init. Так что, если вы хотите распечатать исключения в каком-то конкретном месте, узнайте, как они выдаются, и направьте их оттуда. linfo.org/daemon.html . Опять же, это не имеет ничего общего с выскочкой или даже инициалом в этом отношении. Получите вашу программу, работающую правильно в режиме истинного демона, и затем переместите ее вверх.
— ппетраки
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.