Answers:
Upstart Cookbook中有一整节关于调试技术的内容。您最容易做的就是添加--debug
到内核参数中,这将增加新贵的冗长性,并将所有内容转储到syslog中。是的,调试很复杂,这反映了创建并行化初始化系统所需的净复杂性。我敢肯定还有改进的余地。
当我编写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)
其中actua()是真正的守护程序(它也写入日志)。请注意,我在设置文件中还有一个DEBUG变量,当它为True时,我不会派生该守护程序,因此它将在控制台上执行。
守护进程
守护程序是与Windows服务等效的unix。它们是在后台独立于其他进程运行的进程。这意味着他们的父亲通常是init,并且他们与任何tty无关。由于它们是独立的,因此没有预定义的位置可以放置其输出。
在上面的示例中,我使用了自己的函数,该函数结合了Steinar Knutsens和Jeff Kunces版本中的一些想法,因此有很多python库和代码片段可用于创建守护程序。它尽可能简单,请注意我分了两次。
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()