python-daemon не вызывает функцию запуска
Я следовал этому примеру для реализации демона Python, и он, кажется, работает, но вызывается только функция переконфигурирования.
Это код, который я использовал:
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()
Это код класса менеджера:
@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()
не вызывается. program_configure()
вызывается каждый раз, когда читается файл python, вот и все, но почему нет program_start()
называется?
Я запускаю демон, набрав sudo service station.sh start
и строка, которая запускает скрипт:
python $DAEMON start
РЕДАКТИРОВАТЬ: Прочитав немного, я понял, что программа, вероятно, выходит или зависает context.__enter__()
(with
называет это). Но я понятия не имею, что вызывает это
1 ответ
Проблема была не в том, что python-демон не вызывал функции, а в том, что регистрация не работала.
Когда демон создает новый процесс, он не передает все файловые дескрипторы из материнского процесса - поэтому журналы не записываются. Смотрите этот вопрос для получения дополнительной информации.
Решение этой проблемы заключается в использовании 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],
)