Налагодження: вихідні та консольні скрипти


16

Як ви відправляєте вихідний сценарій для запуску в термінал, щоб знайти сліди в коді python? Мені потрібно вічно робити речі без слідів, які займали лише секунду. Мені потрібно здійснити кілька дзвінків на запис файлів, щоб відстежувати помилки. Те, що потрібно було знайти заздалегідь, за допомогою зворотного простеження - це кілька хвилин. Це жалюгідне. Це триває вже кілька тижнів, і мені це нудно. Чи хотіли б хто-небудь говорити з цього приводу. Я відчуваю, що знову використовую збірку без налагоджувача.

Відповіді:


27

Якщо ви використовуєте Upstart 1.4 або новішу console logверсію, введіть у свою роботу Upstart і весь результат для stdout / stderr закінчиться /var/log/upstart/<job>.log. Тоді ви можете зробити, tail -f /var/log/upstart/<job>.log &щоб вихід з'явився в терміналі.


Добре спізнився на вечірку, але ця відповідь врятувала мене :) Також схоже, що це працює для мене без особливих налаштувань у файлі конфіденційного конфлікту. З мого боку це повинна бути прийнята відповідь.
rslite

Не знаю, чи були журнали обслуговування керованих служб /var/log/upstart. Дійсно корисно, дякую.
Франциско

2

У кулінарній книзі Upstart є цілий розділ про методи налагодження . Найпростіше, що ви можете зробити, - це додати --debugдо аргументів ядра, що збільшить багатослівність і перекине все на syslog. Так, налагодження є складним, це відображення чистої складності, необхідної для створення паралельної системи init. Я впевнений, що є місце для вдосконалення.


2
книга кухаря не належним чином пояснює середовище налагодження новому бажаючому. Я бачив подібні пояснення і раніше. Є або бракує, або робити припущення для гуру. Це дуже засмучує людей, які хочуть додати до спільноти і тільки починають. Я ніколи не стикався з середовищем програмування, яке не надало рядки коду, де виникає помилка, за винятком зборів, де ви винаходите колесо, щоб це можна було пробачити.
bambuntu

Ну, що б ти тоді запропонував? Це відкритий документ. Якщо у вас є техніка налагодження, яка стрибає і межує вище того, що там представлено, тоді додайте її. Проблеми ОП є скоріше наслідком нерозуміння того, як керувати основними парадигмами unix у його додатковому режимі виконання порівняно з контекстом, в якому він розгорнутий. Тільки тому, що ви тут використовуєте python або [вставте модну мову виконання], це не означає, що ви дістатись до ігнорування основного часу виконання, UNIX.
ppetraki

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 у файлі налаштувань, коли це правда, я не розщеплюю демона, щоб він виконувався на консолі.

Демони

Демони - це еквівалент unix сервісам Windows. Це процеси, які працюють у фоновому режимі, незалежно від інших процесів. Це означає, що їх батько, як правило, інітій, і що вони відсторонені від будь-яких. Оскільки вони незалежні, то немає наперед визначеного місця для розміщення їх результатів.

Існує багато бібліотек і фрагментів 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()

Ну гаразд. оскільки ви вже входите в syslog, тоді просто відфільтруйте свої демонові повідомлення та скиньте їх на консоль. Я не бачу, чому це характерно для початку? SysV init матиме ту саму проблему.
ppetraki

Ви маєте рацію, але не особливо специфічно, щоб сказати правду, більшість моїх серверів працює 8.04, без запуску. Але це справедливо і для запуску. OP запитував, як налагодити сценарії python з початковим запуском, а не для методу, який працює лише з upstart. Я не входжу в syslog, а в конкретний файл, і "трюк" тут - це ловити всі винятки та скидати слід стека до цього файлу.
Хав'єр Рівера

ну це просто управління stdout на основі контексту? Я знаю безліч демонів Unix, які мають еквівалентну багатослівність ведення журналу незалежно від того, приєднано вони до tty чи функціонує як демон. Якби це Ruby, я би переобладнав або прикрасив метод базового класу, який винятки використовують для виведення. Я впевнений, що щось подібне можна зробити і в Python. Вам може бути краще подати це запитання щодо належного обміну стеками. Це скоріше основна проблема кодування / дизайну демона Unix, і, як ви заявили, це не має нічого спільного з init-скриптами.
ppetraki

Я все ще знайомлюся з лінгвом. Я вважаю, що демон, ви маєте на увазі конкретний сценарій, який працює у фоновому режимі. У вашому коді я просто ставлю свій скрипт замість actua (), щоб отримати зворотні виклики для цього виклику сценарію? Чи все-таки є канал, щоб консоль замість файлу?
bambuntu

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