有一个名为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

但是,如果我测试kill logview,条件触发并且我确实看到了打印的消息,但是随后我又一次又一次地看到它。如果logview死了,这个条件似乎会触发循环的每个迭代。而且,它永远无法正确重启。
很明显…我做错了什么。=)
任何帮助(或更好的方法!)非常感谢。

最佳答案

我不知道你的logview程序,但问题是:

logview_cli_list = [logview]
logview_cli_list.extend(logview_process.args)

在创建参数列表时,您将logview放在命令中两次,因为logview_process.args还包含已启动命令的名称,因此程序可能会由于参数不正确而立即失败,并会反复运行…
解决办法显而易见:
logview_cli_list = logview_process.args

如果设置了给定的标志并在开始时设置该标志,则更好的解决方法是在循环中创建进程。
当进程结束时,设置标志以再次触发进程创建。本可以避免这个复制/几乎粘贴的错误。

10-08 12:05