有一个名为 logivew 的小应用程序,我正在编写一个脚本来监视它以及其他一些任务。在主 while 循环中(当我最关心的应用程序关闭时将退出),我检查 logview 是否需要重新启动。我目前的代码大致如下:
#a good old global
logview = "/usr/bin/logview"
#a function that starts logview:
port = 100
log_file = "/foo/bar"
logview_process = subprocess.Popen([logview, log_file, port],
stdout = subprocess.DEVNULL,
stderr = subprocess.STDOUT)
#a separate function that monitors in the background:
while True:
time.sleep(1)
logview_status = 0
try:
logview_status = psutil.Process(logview_process.pid).status()
except psutil.NoSuchProcess:
pass
if(logview_status == psutil.STATUS_STOPPED or
logview_status == psutil.STATUS_ZOMBIE or
logview_status == psutil.STATUS_DEAD or
logview_status == 0):
print("Logview died; restarting")
logview_cli_list = [logview]
logview_cli_list.extend(logview_process.args)
logview_process = subprocess.Popen(logview_cli_list,
stdout = subprocess.DEVNULL,
stderr = subprocess.STDOUT)
if(some_other_condition): break
但是,如果我测试终止 logview,条件触发并且我确实看到了打印的消息,但随后我又一次又一次地看到它。如果 logview 确实死了,该条件似乎会触发循环的每一次迭代。而且,它永远不会正确重启。
很明显……我做错了什么。 =)
任何帮助(或更好的方法!)将不胜感激。
最佳答案
我不知道你的 logview 程序,但问题出在这里:
logview_cli_list = [logview]
logview_cli_list.extend(logview_process.args)
当您创建参数列表时,您在命令中放置了两次 logview
,因为 logview_process.args
还包含启动命令的名称,因此该程序可能由于错误的参数而立即失败,并一次又一次地运行...
修复很明显:
logview_cli_list = logview_process.args
如果设置了给定标志并在开始时设置标志,则更好的解决方法是在循环中创建进程。 当进程死亡时,设置标志以再次触发进程创建。本来可以避免这种复制/几乎粘贴的错误。
关于python - 重启死亡进程的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44506794/