Правильный способ написать демон в 2019 году на Python - PullRequest
5 голосов
/ 11 марта 2019

TL; DR;

Я хотел бы написать демона на Python, но я чувствую, что PEP 3143 излишен сейчас, когда почти все используют systemd. Я ищу совет для хорошего начала, чтобы написать демон на Python.

Context

Читая другие связанные вопросы по SO, кажется, что есть до и после systemd. Статьям, которые я прочитал, уже более 10 лет, и я чувствую, что в настоящее время гораздо проще добиться того, чего я хочу.

Я хотел бы написать программный контейнер, который можно запустить:

  • Спереди (блокировка) ($ ./foo)
  • На заднем плане ($ ./foo &)
  • В отсоединенном состоянии ($ ./foo start, $ ./foo stop).
  • Управляется systemd ($ sudo systemctl start foo)

Для возможности start и stop программа сама потребует следующих команд:

$ daemon start
$ daemon stop
$ daemon status

Также, если программа способна демонизировать себя, она также позаботится о некоторых побочных эффектах (предотвращение зомби, двойной форк, pidfile, ведение журнала ...)

Я еще не понял, как управлять журналом. Поскольку демон отсоединен от TTY, он должен перенаправить stdin, stdout, stderr на /dev/null и использовать вместо него регистратор. Для использования регистратора я вижу различные варианты:

  1. Используйте системный журнал, но требуйте права на запись для /dev/log
  2. Используйте от daemon.log до stdout и systemd, но требуется systemd
  3. Использовать пользовательский файл журнала, который будет указан с --log=~/foo.log
  4. Используйте stdout / stderr, поскольку процесс не отключен

Для файла PID традиционное расположение - /var/run/, к которому большинство пользователей не имеют доступа. Таким образом, пользователь должен иметь возможность настроить --pidfile.

Отсюда я понимаю, что создание простого демона - непростая задача, и я не знаю, с чего начать.

Один из тривиальных подходов - иметь две отдельные программы. Одна простая программа блокировки, которая выполняет задачу, использует stdout и один диспетчер процессов, который может делать то же, что и systemd, но на уровне пользователя.

Если бы я суммировал свой вопрос в одном предложении, я бы сказал:

Стоит ли использовать PEP3143 Standard daemon process library в 2019 году для написания демона на Python вместо того, чтобы полагаться на менеджер демонов, такой как systemd? ​​

...