Debug: output della console e script di avvio


16

Come si invia l'output di uno script upstart a un terminale in modo da trovare traceback nel codice Python? Mi sta portando per sempre a fare cose senza ripercussioni che in passato richiedevano solo un secondo. Devo effettuare diverse chiamate di scrittura di file per rintracciare gli errori. Ciò che ha impiegato il secondo a trovare prima con un traceback è passare a diversi minuti minuti. Questo è miserabile. Questo è successo da alcune settimane e sono stufo di questo. qualcuno ne parlerebbe per favore. Sento che sto usando di nuovo assembly senza un debugger.

Risposte:


27

Se si utilizza Upstart 1.4 o versioni successive, inserire console logil lavoro Upstart e tutto l'output su stdout / stderr finirà per /var/log/upstart/<job>.log. Quindi puoi fare tail -f /var/log/upstart/<job>.log &in modo che l'output appaia nel terminale.


Un po 'tardi alla festa, ma questa risposta mi ha salvato :) Sembra anche che funzioni per me senza alcuna impostazione speciale nel file conf upstart. Da parte mia, questa dovrebbe essere la risposta accettata.
rslite,

Non sapevo che fossero presenti i log dei servizi gestiti upstart /var/log/upstart. Davvero utile, grazie.
Francisco,

2

C'è un'intera sezione sulle tecniche di debug nel ricettario Upstart . La cosa più semplice che puoi fare è aggiungere --debugagli argomenti del tuo kernel, che aumenteranno la verbosità di upstart e scaricheranno tutto su syslog. Sì, il debug è complesso, è un riflesso della complessità netta richiesta per creare un sistema init parallelizzato. Sono sicuro che c'è spazio per miglioramenti.


2
il libro di cucina non spiega correttamente un ambiente di debug a un nuovo arrivato. Ho visto spiegazioni simili prima. Mancano o fanno ipotesi di guru. È molto frustrante per le persone che vogliono aggiungere alla community e che hanno appena iniziato. Non mi sono mai imbattuto in un ambiente di programmazione che non ha fornito la riga di codice in cui si verifica l'errore tranne che in assembly, in cui si reinventa la ruota, in modo che possa essere perdonato.
bambuntu

Bene, cosa suggeriresti allora? È un documento aperto. Se hai una tecnica di debug che fa passi da gigante sopra ciò che viene presentato lì, per favore aggiungila. I problemi del PO sono più il risultato di non capire come gestire i paradigmi unix di base all'interno del suo runtime di scelta aggiuntivo rispetto al contesto in cui viene distribuito. Solo perché stai usando python o [inserisci qui un linguaggio di runtime di fantasia] non significa che tu ignorare il runtime fondamentale, UNIX.
ppetraki,

2

Quando scrivo un demone Python prendo tutte le eccezioni e poi lancio il file di registro. Non solo uso per il debug, ma anche in produzione. Ho una piccola sceneggiatura che eseguo ogni mattina che cerca qualcosa di sconvolgente nei registri.

Naturalmente aiuta anche a far funzionare il demone.

Qualche codice di esempio (rimuovo le parti non interessanti):

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)

Dove actua () è il vero demone (scrive anche per accedere). Nota che ho anche una variabile DEBUG in un file di impostazioni, quando è True, non eseguo il fork del demone, quindi viene eseguito sulla console.

Demoni

I demoni sono l'equivalente unix dei servizi di Windows. Sono processi eseguiti in background indipendenti da altri processi. Ciò significa che il loro padre è di solito init e che sono distaccati da qualsiasi tty. Poiché sono indipendenti, non esiste un luogo predefinito in cui inserire il proprio output.

Ci sono molte librerie e frammenti di pitone per creare un demone, nell'esempio sopra uso la mia funzione, che combina alcune idee delle versioni di Steinar Knutsens e Jeff Kunces. È il più semplice possibile, nota che forzo due volte .

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()

D'accordo. dal momento che stai già accedendo a syslog, quindi filtra semplicemente i tuoi messaggi daemon e scaricali sulla console. Non vedo perché questo è specifico per l'avvio? SysV init avrebbe lo stesso problema.
ppetraki,

Hai ragione, non è specifico per l'avvio, a dire la verità la maggior parte dei miei server esegue 8.04, no upstart. Ma è valido anche per l'avvio. OP stava chiedendo come eseguire il debug degli script Python con upstart, non per un metodo che funziona solo con upstart. Non sto registrando su syslog ma su un file specifico, e il 'trucco' qui sta catturando tutte le eccezioni e scaricando la traccia dello stack su quel file.
Javier Rivera,

bene, questo è solo gestire stdout in base al contesto giusto? Conosco molti demoni unix che hanno una verbosità di registrazione equivalente indipendentemente dal fatto che sia collegato a un tty o funzioni come un demone. Se questo fosse Ruby, scavalcherei o decorerei il metodo della classe base che le eccezioni usano per l'output. Sono sicuro che qualcosa di simile può essere fatto in Python. Potresti essere servito meglio facendo questa domanda sullo scambio di stack corretto. Questo è più un problema di codifica / progettazione del demone unix di base e, come hai detto, non ha nulla di specifico a che fare con gli script di init.
ppetraki,

Sto ancora familiarizzando con il gergo. Presumo per demone, intendi uno script specifico che viene eseguito in background. Nel tuo codice, ho appena messo il mio script al posto di actua () per ottenere i callback per quella chiamata di script? Esiste un modo per canalizzarlo su una console anziché su un file?
bambuntu

1
i demoni in senso autonomo di solito sono distaccati dal tty su cui sono stati avviati, hanno chiuso i loro handle di file originali su stdin, stdout e stdin e sono figli di init. Quindi, se vuoi stampare le eccezioni in un posto specifico, scopri come vengono emesse e indirizzale da lì. linfo.org/daemon.html . Ancora una volta, questo non ha nulla a che fare con upstart o anche init per quella materia. Fai in modo che il tuo programma funzioni correttamente nella modalità demone reale e poi spostalo verso l'alto.
ppetraki,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.