我是python的新手,想要熟悉,所以我创建了一个python脚本,它使用子进程中的Popen来执行bash脚本。 bash脚本为后台运行的c ++程序设置环境并执行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脚本的每种执行方式会有不同的行为?
监督是否正确让父母等待孩子。当孩子退出时,重新启动它。这就是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秒的延迟重启程序。