我一直在遵循this example来实现一个python守护进程,它似乎在某种程度上起作用了,但只调用了reconfigure函数。
这是我一直在使用的代码:
import signal
import daemon
import lockfile
import manager
context = daemon.DaemonContext(
working_directory='/home/debian/station',
pidfile=lockfile.FileLock('/var/run/station.pid'))
context.signal_map = {
signal.SIGTERM: manager.Manager.program_terminate,
signal.SIGHUP: 'terminate',
signal.SIGUSR1: manager.Manager.program_reload_configuration,
}
manager.Manager.program_configure()
with context:
manager.Manager.program_start()下面是manager类的代码:
@staticmethod
def program_configure():
logging.info('Configuring program')
@staticmethod
def program_reload_configuration():
logging.info('Reloading configuration')
@staticmethod
def program_start():
global Instance
logging.info('Program started')
Instance = Manager()
Instance.run()
@staticmethod
def program_terminate():
logging.info('Terminating')日志中只显示:
INFO:root:Configuring program由于某种原因,program_start()没有被调用。每次读取python文件时都会调用program_configure(),但为什么不调用program_start()呢?
我通过键入sudo service station.sh start来启动守护进程,运行脚本的代码行是:
python $DAEMON start编辑:在读了一点之后,我意识到程序可能在context.__enter__() (with调用)中退出或挂起。但我不知道是什么导致了这一切
发布于 2016-03-24 18:48:49
问题不在于python-daemon没有调用函数,而是日志记录不起作用。
当守护进程创建一个新进程时,它不会传输来自母进程的所有文件句柄-因此不会写入日志。有关详细信息,请参阅this question。
解决方案是使用files_preserve属性,如下所示:
# Set the logger
LOG_LEVEL = logging.DEBUG
logger = logging.getLogger()
logger.setLevel(LOG_LEVEL)
fh = logging.FileHandler(LOG_FILENAME)
logger.addHandler(fh)
# Not create the context, and notify it to preserve the log file
context = daemon.DaemonContext(
working_directory='/home/debian/station',
pidfile=lockfile.FileLock('/var/run/station.pid'),
files_preserve=[fh.stream],
)https://stackoverflow.com/questions/36181240
复制相似问题