调试:控制台输出和新贵脚本

bam*_*ntu 16 debug upstart console

如何将 upstart 脚本的输出发送到终端以便在 python 代码中找到回溯?过去只需一秒钟,我就可以在没有追溯的情况下做事。我不得不放置几个文件写入调用来跟踪错误。以前用回溯找到的东西现在变成了几分钟。这是悲惨的。这种情况已经持续了几个星期,我已经厌倦了。请一些人谈谈这个。我觉得我再次使用没有调试器的程序集。

Tum*_*oid 27

如果您使用 Upstart 1.4 或更新版本,请放入console log您的 Upstart 作业,所有输出到 stdout/stderr 的结果将是/var/log/upstart/<job>.log. 然后你可以让tail -f /var/log/upstart/<job>.log &输出出现在终端中。


ppe*_*aki 2

Upstart Cookbook中有一整节关于调试技术的内容。您可以做的最简单的事情就是添加--debug到内核参数中,这将增加 upstart 的冗长性并将所有内容转储到系统日志中。是的,调试很复杂,它反映了创建并行初始化系统所需的网络复杂性。我确信还有改进的空间。

  • 这本烹饪书没有向新手正确解释调试环境。我以前见过类似的解释。要么缺乏大师假设,要么做出大师假设。对于想要加入社区并刚刚开始的人来说,这非常令人沮丧。我从未遇到过不提供发生错误的代码行的编程环境,除了在汇编中,您正在重新发明轮子,因此这是可以原谅的。 (3认同)

Jav*_*era 2

当我编写 python 守护程序时,我捕获所有异常并将其抛出到日志文件中。我不仅用于调试,也在生产中使用。我有一个每天早上运行的小脚本,用于在日志中查找令人不安的内容。

当然,它也有助于保持守护进程运行。

一些示例代码(我删除了不感兴趣的部分):

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)
Run Code Online (Sandbox Code Playgroud)

其中 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()
Run Code Online (Sandbox Code Playgroud)