我需要用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:'塊。沒有改變。 –