【问题标题】:Run programs in background and redirect their outputs to file in real time在后台运行程序并将其输出实时重定向到文件
【发布时间】:2015-09-29 12:04:59
【问题描述】:

我想在一个 bash 会话中同时运行多个 python 脚本,并分别实时检查它们的输出。为了完成这个任务,我编写了一个简单的 bash 脚本,如下所示:

#!/bin/bash
python 1.py > 1.output &
python 2.py > 2.output &
python 3.py > 3.output &

当我在执行过程中使用cat 1.output 命令检查打印的内容时,什么都看不到。

想了一会儿,我意识到1.output必须在1.py执行完毕后填写。也就是说,我这里使用的方法不是real time时尚。

您可以建议等待这些 python 脚本完成。不幸的是,事实上所有的 python 脚本实际上都是长期运行的程序,它们可能会在几天或几个月后完成,这就是为什么我想实时检查它们的输出。

另外,您可能会建议我修改 python 脚本以直接将消息打印到文件而不是stdout。抱歉,这里的脚本太复杂,修改不了,里面有print函数的夹子。

我现在能做什么?

【问题讨论】:

  • 让 python 脚本定期刷新它们的输出...
  • 请发布您用于此日志记录操作的代码。

标签: python bash redirect background-process


【解决方案1】:

-u 开关和等效的PYTHONUNBUFFERED 环境变量强制 stdout 无缓冲。试试这个:

#!/bin/bash
python -u 1.py > 1.output &
python -u 2.py > 2.output &
python -u 3.py > 3.output &

#!/bin/bash
export PYTHONUNBUFFERED=yes
python 1.py > 1.output &
python 2.py > 2.output &
python 3.py > 3.output &

请注意,-u 有副作用:阅读文档以了解更多信息。

参考:

【讨论】:

    【解决方案2】:

    您可以尝试通过以下方式覆盖脚本中的 stderr/stdout:

    # in the beginning of your script
    import os
    import sys
    
    desired_output_file = open('/path/to/file', 'a')
    os.dup2(desired_output_file.fileno(), sys.stdout)
    os.dup2(desired_output_file.fileno(), sys.stderr)
    

    然后所有print 调用将写入这个特殊文件,而不是标准输出。但是,主要问题可能是缓冲 IO。您必须以某种方式将此类文件的内容flush 写入磁盘。

    【讨论】:

      【解决方案3】:

      如果您可以在程序中找到某种主循环,这可能是一个很好的进度指标,那么执行写入文件会很好。如果你说直到输出流被 Python 关闭后输出才会填满,那么这可能是最简单的替代方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-17
        相关资源
        最近更新 更多