Подпроцесс завершается, когда родительский скрипт на python останавливается systemd - PullRequest
0 голосов
/ 19 февраля 2019

Я новичок в python и хотел познакомиться, поэтому я создал скрипт на python, который использует Popen из подпроцесса для выполнения скрипта bash.Сценарий bash устанавливает среду и запускает программу на C ++ для запуска в фоновом режиме.

Предполагаемое использование - запуск сценария python в качестве службы, отслеживающей процесс C ++ и, если процесс C ++завершите работу, снова запустите сценарий запуска bash.

Все работает так, как задумано, если я запускаю сценарий python из командной строки (./proc_watchdog.py), а затем ctr + c, процесс C ++ продолжит работать.

Если я затем выполню скрипт python, используя systemd, systemd start pythonscript.service, а затем остановлю его systemd stop pythonscript.service, программа C ++ завершит работу.

Файл .service:

[Unit]
Description=RustDedicated watchdog service
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=1
User=scriptuser
ExecStart=/path/to/C++_Prog_Dir/proc_watchdog.py

[Install]
WantedBy=multi-user.target

Скрипт python:

#!/usr/bin/python3

import subprocess as sp
import os
import psutil
import time

backgroundProc = "Procname"

def processWatchdog():
   waitCount = 0;

   while True:
      procList = []

      for proc in psutil.process_iter():
         procList.append(proc.as_dict(attrs=['name']))

      found = 0
      for pname in procList:
         if backgroundProc == pname['name']:
            print("Process running")
            found = 1

      if found == 0:
         print("Process not found...")
         waitCount += 1
         if waitCount == 3:
            p = sp.Popen(["/path/to/C++_Prog_Dir/start.sh"])
            print("Restarting")
            p.wait()
            waitCount = 0
            print("Restarted")

      time.sleep(2)

if __name__ == '__main__':
   processWatchdog()

Пример скрипта Bash:

#!/bin/bash

./c++_process &>> /dev/null &

exit 0

Может кто-нибудь помочь мне понять, почему скрипт python будет вести себя по-разному для каждого из способов его выполнения?

1 Ответ

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

Правильно ли присматривайте, чтобы родитель ждал ребенка.Когда ребенок выйдет, перезапустите его.Это то, что делает DJB daemontools.

Измените ваш сценарий с:

./c++_process &>> /dev/null &

на:

exec ./c++_process &>> /dev/null

Тогда ваша сторожевая собака будет немедленно предупреждена, когда p.wait()возвращает, что он должен перезапустить программу после выхода.При этом ваша сторожевая собака может быть уменьшена до:

import subprocess as sp
import time

def processWatchdog():

   while True:
       p = sp.Popen(["/path/to/C++_Prog_Dir/start.sh"])
       p.wait()

       time.sleep(2)

if __name__ == '__main__':
   processWatchdog()

, что просто перезапускает программу с задержкой в ​​2 секунды.

...