Служба Python Systemd останавливается вскоре после запуска - PullRequest
0 голосов
/ 14 ноября 2018

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

pyntp.service * * 1004

[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 Ответ

0 голосов
/ 14 ноября 2018

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

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

...