Systemctl блокировка при запуске моего демона - PullRequest
0 голосов
/ 13 февраля 2019

Я написал небольшой демон на 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: Unitвошел в состояние отказа.13 февраля, 13:49:10. Raspberrypi systemd [1]: daemon.service: не удалось с результатом 'timeout'.

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

1 Ответ

0 голосов
/ 13 февраля 2019

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

Type=simple

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

systemctl status 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
...