Служба Python Systemd останавливается вскоре после запуска

Я пытался запустить скрипт Python как системный сервис, но сервис не запускается. Вот моя конфигурация:

pyntp.service:

[Unit]
Description=Python NTP Service
After=multi-user.target

[Service]
Type=forking
ExecStart=/usr/bin/python $HOME/ntp/ntpservice.py

[Install]
WantedBy=multi-user.target

ntpservice.py:

#!/usr/bin/python

import os
import time
import json

pid = os.fork()

if pid == 0:
    print 'parent'
else:
    print 'child'
    while True:
        print('123')
        time.sleep(1)

Шаг для запуска службы заключается в следующем:

cp pyntp.service  /etc/systemd/system/
cp ntpservice.py /usr/local/bin/

systemctl daemon-reload
systemctl enable pyntp.service
systemctl start pyntp.service

Дело в том, что когда я пытаюсь увидеть статус службы pyntp, это всегда так:

● pyntp.service - Python NTP Service
   Loaded: loaded (/usr/lib/systemd/system/pyntp.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Wed 2018-11-14 22:27:56 CST; 34min ago
  Process: 801 ExecStart=/usr/bin/python $HOME/ntp/ntpservice.py (code=exited, status=0/SUCCESS)
 Main PID: 801 (code=exited, status=0/SUCCESS)

Nov 14 22:27:56 HES1 systemd[1]: Started Python NTP Service.
Nov 14 22:27:56 HES1 systemd[1]: Starting Python NTP Service...

Может ли кто-нибудь помочь мне решить эту проблему? Благодарю.

1 ответ

Ваша программа ведет себя как ожидалось. Просто forkИнга недостаточно, чтобы создать демона. Происходит то, что ваш код выполняется до тех пор, пока выполняется его родительский процесс, а затем (обе ветки) завершаются, когда родительский процесс завершается. То, что вы хотите, - это написать демон (и управлять им с помощью systemd). Этот вопрос может оказаться полезным при объяснении некоторых простых способов сделать это: как создать демона в Python?

fork является важной частью этого процесса, но просто делает fork само по себе не полностью решает проблему. Если вы хотите увидеть более подробный пример того, как демонизировать ваш процесс вручную, используя fork Вы можете прочитать это: код Python для демонизации процесса?

Другие вопросы по тегам