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
и использовать вместо него регистратор. Для использования регистратора я вижу различные варианты:
- Используйте системный журнал, но требуйте права на запись для
/dev/log
- Используйте от
daemon.log
до stdout
и systemd
, но требуется systemd
- Использовать пользовательский файл журнала, который будет указан с
--log=~/foo.log
- Используйте
stdout
/ stderr
, поскольку процесс не отключен
Для файла PID традиционное расположение - /var/run/
, к которому большинство пользователей не имеют доступа. Таким образом, пользователь должен иметь возможность настроить --pidfile
.
Отсюда я понимаю, что создание простого демона - непростая задача, и я не знаю, с чего начать.
Один из тривиальных подходов - иметь две отдельные программы. Одна простая программа блокировки, которая выполняет задачу, использует stdout
и один диспетчер процессов, который может делать то же, что и systemd
, но на уровне пользователя.
Если бы я суммировал свой вопрос в одном предложении, я бы сказал:
Стоит ли использовать PEP3143 Standard daemon process library
в 2019 году для написания демона на Python вместо того, чтобы полагаться на менеджер демонов, такой как systemd
?