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

16

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

bambuntu
источник

Ответы:

27

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

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

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

ppetraki
источник
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 . Опять же, это не имеет ничего общего с выскочкой или даже инициалом в этом отношении. Получите вашу программу, работающую правильно в режиме истинного демона, и затем переместите ее вверх.
ппетраки