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