我需要用web界面编写简单的守护进程。从python守护进程启动线程的正确方法
想法是在一个线程内使用python-daemon package并运行wsgiref.simple_server
。
守护程序正常工作与下面的代码:
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()
启动一个线程是这样的:
def web_gui():
logger.info('weg gui started')
web = threading.Thread(target=web_gui)
web.setDaemon(True)
def initial_program_setup():
logger.info('daemon started')
web.start()
则看起来像守护进程退出线程完成后。添加类似
while True:
time.sleep(1)
到web_gui()
(使线程运行永远,就像一个web服务器应该)让事情变得更糟:连行web gui started
日志显示不出来。
我的问题是:
- 为什么这不起作用?在守护进程中启动线程的正确方法是什么?
- 也许有更好的方法通过Web界面控制守护进程?有了这样的体系结构,我认为我应该为每个界面页面启动新的线程,这是难以扩展的。
谢谢。
配售'web.start()''之间具有上下文:'和'do_main_program'引线达到相同的结果。我会尝试http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/或http://supervisord.org/index.html。那么整体设计呢?可以为每个页面运行wsgi-servers线程吗? –
尝试在守护程序上下文中移动创建'Thread'对象。 –
将'web = threading.Thread(target = web_gui)'移至'with context:'块。没有改变。 –