python - 重启死亡进程的方法

标签 python linux

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

相关文章:

python - 生成器返回失败的 Mocks assert_called_with

python - python tkinter 递归中的皮亚诺曲线

使用 **kwargs 设置属性时出现 Python3 AttributeError

linux - 是什么导致了这个错误 : No such file or directory

linux - 如何使用非默认运行参数在 AWS Elastic Beanstalk 中运行 Docker 容器?

linux - 如何解析我想在 shell 命令中提取的单词?

linux - 无法在 Jenkins 构建中使用 .bash_profile 的别名

python - celery 与 RabbitMQ : AttributeError: 'DisabledBackend' object has no attribute '_get_task_meta_for'

python - 如何在给定时间间隙的情况下创建基于时间阈值的列?

java - 如何从 Java 终端运行我的语句?