【问题标题】:How to make shell output redirect (>) write while script is still running?如何在脚本仍在运行时使 shell 输出重定向(>)写入?
【发布时间】:2011-02-14 18:01:33
【问题描述】:

我写了一个永不终止的简短脚本。该脚本不断生成我必须不时检查的输出。我通过 SSH 在实验室计算机上运行它,并将输出重定向到该计算机上我的 public_html 文件夹中的文件。

python script.py > ~/public_html/results.txt

但是,当我刷新地址时,结果不会立即显示。结果显示在我终止程序时,但正如我所说,它不会自行停止。那个重定向(>)是懒惰写作吗?有没有办法连续(或间隔)更新文件中的结果?

还是网络服务器在文件仍在写入时不更新文件?

【问题讨论】:

    标签: python linux bash shell command-line


    【解决方案1】:

    如果你想立即看到它,你需要刷新输出sys.stdout.flush()(或smth)。见this

    【讨论】:

    • 哦,谢谢,我马上试试。我不认为这是 python 缓冲输出。 --edit:我试过了,没什么区别。所以要么> 正在缓冲,要么是网络服务器。
    • 别在意前面的评论,我很不耐烦。它仍然不是“实时的”,但可能是浏览器缓存。
    【解决方案2】:

    我怀疑文件正在被连续写入,但 Web 服务器报告文件的修改日期为打开时间,因此报告文件未发生更改,结果正在缓存中(在 Web 服务器或客户端)。

    我会先尝试强制重新加载(Ctrl+F5 或 Ctrl+Shift+R 或 Shift+),看看是否有帮助。如果没有,那么您可以尝试其他方法。

    在服务器上的一个单独的 shell 中,做

    tail -f ~/public_html/results.txt
    

    Tail 打印出文件的最后 n 行(其中 n 默认为 10),但 -f 参数监视文件并随着文件的增长继续报告输出。这至少会让您确信文件正在被增量写入。

    希望对你有帮助。

    【讨论】:

    • 谢谢,nc3b 的解决方案奏效了。尾部显示最新的结果,因为它们被写入。浏览器视图现在每隔很短的时间就会批量更新。强制刷新不会改变这一点。但它已经足够快了。
    【解决方案3】:

    stdout 被缓冲,如果没有连接到终端。

    您可以通过 stdbuf

    将此策略更改为行缓冲
    stdbuf -oL python script.py > ~/public_html/results.txt
    

    因此,如果不需要行缓冲,您不必刷新 Python 脚本并保持其 IO 效率。

    【讨论】:

    • 如果有节制地调用,这会比 python 的 flush() 效率低吗?我现在使用flush(),每行调用不到一次。
    • 我怀疑会有什么不同,因为如果你不使用flush(3),数据很可能不会被写入磁盘。如果您在终端上使用您的应用程序,则默认为行缓冲。对于长时间运行的后台作业,重定向到文件将选择更有效的缓冲。对于像您这样的特殊情况,您始终可以使用 stdbuf,从而将 IO-Code 排除在您的应用之外,使其灵活且更具可读性。
    • 在哪里可以找到 ubuntu 上的 stdbuf?似乎没有包含在 coreutils 包中
    • 我实际上更喜欢这个而不是接受的答案,因为它更通用并且不需要修改源代码。 (或者用更专业的术语来说,这绝对是一团糟。)
    猜你喜欢
    • 2016-10-29
    • 1970-01-01
    • 2018-08-12
    • 2023-03-30
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    相关资源
    最近更新 更多