Блокировка Systemctl при запуске моего демона

Я написал небольшой демон на Python с помощью:

#!/usr/bin/python3

import time
import click
import daemonocle

from daemonocle.cli import DaemonCLI

@click.command(cls=DaemonCLI, daemon_params={'pidfile': '/var/run/daemon.pid'})
def main():
    while True:
        time.sleep(3)

if __name__ == '__main__':
    main()

Он прекрасно работает как есть. Если я сделаю следующее, я получу хороший статус выхода 0

$ sudo ./daemon start 
Starting daemon ... OK    

$ echo $?
0

Затем я написал сервисный файл systemd:

[Unit]
SourcePath=/home/pi/daemon/daemon
Description=My First Daemon
Before=multi-user.target
After=mosquitto.target

[Service]
Type=forking
PIDFile=/var/run/daemon.pid
Restart=no
ExecStart=/home/pi/daemon/daemon start
ExecStop=/home/pi/daemon/daemon stop
ExecReload=/home/pi/daemon/daemon reload

И если я попытаюсь запустить свой демон с помощью systemctl, команда останется заблокированной:

$ sudo systemctl start daemon
^C
$ sudo systemctl status daemon
? daemon.service - XEMWAY Demo Service
   Loaded: loaded (/home/pi/daemon/daemon; static; vendor preset: enabled)
   Active: activating (start) since Wed 2019-02-13 13:47:40 GMT; 12s ago
  Process: 13044 ExecStop=/home/pi/daemon/daemon stop (code=exited, status=0/SUCCESS)
 Main PID: 12304 (code=exited, status=143); Control PID: 13079 (daemon)
   CGroup: /system.slice/daemon.service
           +-13079 /usr/bin/python3 /home/pi/daemon/daemon start
           +-13081 /usr/bin/python3 /home/pi/daemon/daemon start

Через минуту systemd говорит:

13 февраля, 13:49:10 raspberrypi systemd[1]: daemon.service: устройство перешло в состояние сбоя. 13 февраля, 13:49:10 raspberrypi systemd[1]: daemon.service: Ошибка с результатом «тайм-аут».

Что не так с этим?


person nowox    schedule 13.02.2019    source источник
comment
Может быть, проще использовать one-shot вместо forking и не разветвлять его?   -  person deathangel908    schedule 13.02.2019
comment
Нет, это не потому, что мой скрипт уже является демоном   -  person nowox    schedule 13.02.2019
comment
systemd и другие инструменты мониторинга служб действительно предпочитают демоны, которые не разветвляются. Если вы измените своего демона или добавите к нему флаг, чтобы он не отделялся от первого процесса, вы можете сделать его Type=simple, и ему не понадобится файл PID или что-то еще.   -  person Zan Lynx    schedule 13.02.2019


Ответы (1)


Проблема в том, что ваш сервис сам создает демона, а systemd об этом не знает. Это просто простая программа, которая запускается и закрывается после небольшого промежутка времени для systemd. Вместо forking вы хотите использовать simple:

Type=simple

Systemd по-прежнему будет отслеживать ваш процесс как демон, так как он знает свой pid:

статус systemctl test2.service

* test2.service - My First Daemon
   Loaded: loaded (/tmp/a.py; static; vendor preset: disabled)
   Active: active (running) since Wed 2019-02-13 16:06:27 EET; 5s ago
 Main PID: 18104 (python)
    Tasks: 2 (limit: 4915)
   Memory: 10.1M
   CGroup: /system.slice/test2.service
           |-18104 /usr/bin/python /tmp/a.py start
           `-18115 /usr/bin/python /tmp/a.py start
person deathangel908    schedule 13.02.2019
comment
Чего я не понял, так это того, что мой демон Python разветвляется, потому что, когда я делаю ./daemon start, он запускается и возвращается, но демон остается в памяти. Так в чем же смысл forking демонов? - person nowox; 13.02.2019
comment
Как я понимаю, он не разветвляется. daemonocle просто создает дочерний процесс и отсоединяет его от основного процесса. Поправьте меня, если я ошибаюсь, у меня не так много времени на чтение документов :( - person deathangel908; 13.02.2019
comment
Возможно, вы лучше меня знаете об этом. Я не могу сказать, чем отличается дочерний процесс от форка :( - person nowox; 13.02.2019
comment
здесь я могу прочитать, чем os.fork создает дочерний процесс :( Теперь я запутался - person nowox; 13.02.2019
comment
да, но fork — не единственный метод, создающий дочерний процесс. exec также создает дочерний процесс. - person deathangel908; 13.02.2019