当父python脚本被systemd停止时,子过程退出

时间:2019-02-18 23:10:45

标签: subprocess systemd python-3.7

我是python的新手,并且想变得熟悉,所以我创建了一个python脚本,该脚本使用子进程中的Popen执行bash脚本。 bash脚本为此设置了一个环境,并执行了一个c ++程序以在后台运行。

预期用途是将python脚本作为监视C ++进程的服务运行,并且如果C ++进程退出,请再次运行bash启动脚本。

如果我从命令行(./proc_watchdog.py开始python脚本,然后单击ctr + c,一切都会按预期运行,C ++进程将继续运行。

如果我随后使用systemd systemd start pythonscript.service执行python脚本,然后停止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 :(得分:0)

适当地进行监督,让父母等待孩子。当孩子退出时,重新启动它。这就是DJB的daemontools所做的。

从以下位置更改脚本:

res.status.json

收件人:

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

然后,当exec ./c++_process &>> /dev/null 返回时,您的看门狗将立即收到警告,因为它必须在退出程序后重新启动它。这样,您的看门狗可以减少为:

p.wait()

只需简单地以2秒的延迟重新启动程序即可。