LINUX.ORG.RU
ФорумAdmin

Как в systemd добавить скрипт, который является демоном?

 


0

4

Всем добрый день. У меня есть скрипт на питоне, который сам форкается и остается демоном после того, как основной процесс завершается. Если конкретно, то я использую python-daemon И выглядит оно в таком духе.

import daemon
        with daemon.DaemonContext():
                while True:
                        print('Hello')
                        time.sleep(1)
Т.е. если я просто запушу python3 my-daemon.py - мне вернется управление, и даже если я убью парент, то он все-равно будет висеть и выполняться. Теперь я хочу добавить этот скрипт, на автостарт. Поскольку я использую aрчу, самый легкий способ это сделать - добавить сервис в /etc/systemd/system/my-daemon.service. Следовательно вики я должен установить type=forking и все должно работать:
[Unit]
Description=my daemon

[Service]
ExecStart=/usr/bin/python3 /srv/http/mydaemon.py
Restart=always
User=http
ExecReload=/bin/kill -HUP $MAINPID
Type=forking
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Но при таком расскладе, когда я запускаю

systemctl start my-daemon
команда systemctlне возвращает управление и висит пока я не нажму Ctrl+c. В это же время в логах пишется такое:
systemd[1]: my-daemon.service: Start operation timed out. Terminating.
Сам же скрипт просто выполняется и без ошибок. Логично предположить, что systemd ждет, что после выхода main process как-то уведомит ее, чего скорее всего не происходит. Я же просто хочу, чтоб системд его просто не убивал.

Как мне написать конфиг чтоб оно так работало?

★★

Последнее исправление: deathangel908 (всего исправлений: 3)
Ответ на: комментарий от Dron

Потому что вы все путаете причину со следствием. Type=forking был сделан для того, чтобы поддерживать существующие демоны, написанные для sysvinit, а не наоборот.

А исторически — дважды форкаться нужно было, чтобы твоим родителем стал PID 1, а не запустивший тебя скрипт.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

А можно ли как-то написать конфиг конфиг мод мой питон-скрипт? Может тип не forking нужен, а какой-то другой. Я думал сначала его демонизировать полностью с помощью system-d (т.е. убрать оттуда python-daemon), но если я в конфиге сервиса ставлю type: simple, то я ловлю KeyboardInterrupt exception в моей питон-скрипте.

deathangel908 ★★
() автор топика
Ответ на: комментарий от deep-purple

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

исторически — дважды форкаться нужно было

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Если даблфоркать было нужно раньше, то почему нужно даблфоркать сейчас? У ТСа форкается один раз, и этого достаточно. Должно быть. Не?

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Погуглил, похоже и раньше не особо нужно было, просто для уверенности, что процесс не сможет получить контроль над терминалом. Ну и выше было упомянуто, что не воспроизводится.

conformist ★★★
()
Ответ на: комментарий от deep-purple

Не?

Я ещё раз поясню. Поддержка дабл-форкающихся демонов в systemd присутствует исключительно ради легаси. Новые демоны следует писать вообще без форков, потому что так проще. А сингл-форкающиеся демоны — это и не рыба, и не мясо; так не имеет смысла писать ни с точки зрения легаси, ни с точки зрения systemd. Поэтому в systemd они просто не поддерживаются.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Всётаки проблема не в дабл-форке, я написал в 10 строк демона на C и все хорошо работает с 1 форком. Похоже проблема именно у него в скриптоте.

surefire ★★★
()
Последнее исправление: surefire (всего исправлений: 1)
Ответ на: комментарий от i-rinat

Из прочтения PEP-3143 у меня сложилось впечатление, что оно форкается единожды.

Впрочем, вижу — OK, тогда я не прав. Значит, у ТСа процесс почему-то подвисает в середине танца с форками, или же один из предков не завершается. Других причин у «start operation timed out» при Type=forking я не помню.

intelfx ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.