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],
)
Другие вопросы по тегам