我需要写一个简单的具有web界面的守护进程。在
其思想是使用python-daemon package并在一个线程内运行wsgiref.simple_server。在
Daemon可以使用以下代码正常工作:import daemon
import logging
import time
import signal
import threading
logfilename = '/var/log/testdaemon.log'
logger = logging.getLogger("DaemonLog")
logger.setLevel(logging.INFO)
formatter = logging.Formatter(
'%(asctime)s:%(levelname)s:%(message)s',
'%Y-%m-%d %H:%M:%S')
handler = logging.FileHandler(logfilename)
handler.setFormatter(formatter)
logger.addHandler(handler)
def initial_program_setup():
logger.info('daemon started')
def do_main_program():
while True:
time.sleep(1)
logger.info('another second passed')
def program_cleanup(signum, frame):
logger.info('daemon stops')
context.terminate(signum, frame)
def reload_program_config(signum, frame):
logger.info('reloading config')
context = daemon.DaemonContext()
context.signal_map = {
signal.SIGTERM: program_cleanup,
signal.SIGHUP: 'terminate',
signal.SIGUSR1: reload_program_config,
}
context.files_preserve = [handler.stream]
initial_program_setup()
with context:
do_main_program()
但是如果我像这样在initial_program_setup()中启动一个线程:
^{pr2}$
然后看起来守护进程在线程完成后退出。添加类似while True:
time.sleep(1)
to web_gui()(让线程永远运行,就像web服务器应该做的那样)会使情况变得更糟:甚至连web gui started行也不会出现在日志中。在
我的问题是:为什么这样不行?在守护进程中启动线程的正确方法是什么?在
也许有更好的方法可以通过web界面控制守护进程?有了这样的架构,我认为我应该为每个接口页面启动新线程,这很难扩展。在
谢谢。在