【问题标题】:Time taken by `less` command to show output`less` 命令显示输出所花费的时间
【发布时间】:2011-08-21 01:40:28
【问题描述】:

我有一个产生大量输出的脚本。脚本在点 T 处暂停几秒钟。

现在我正在使用less 命令来分析脚本的输出。 所以我执行./script | less。我让它运行足够的时间,以便脚本完成执行。

现在我通过按 Pg Down 键查看 less 命令的输出。令人惊讶的是,当滚动到输出的 T 点时,我再次注意到停顿了几秒钟。

该脚本不需要任何输入,并且在我开始分析 less 的输出时肯定会完成。

有人可以解释一下,当脚本完成执行时,less 的输出中几秒钟的暂停是显而易见的吗?

【问题讨论】:

  • 也许输出的特定页面有大量文本,例如如果有一条非常长的水平线。

标签: linux bash time


【解决方案1】:

管道在操作系统级别已满,因此 script 会阻塞,直到 less 消耗掉一些管道。

【讨论】:

  • 这似乎很容易测试,如果您只是让脚本在输出文本时将内容发送到日志文件。
【解决方案2】:

流量控制。您的脚本实际上被暂停,而更少的分页。

如果你想确保你的命令在你使用less交互之前完成,调用less为less +G,它会读到输入的结尾,然后你可以通过在less中输入1G返回到开头.

【讨论】:

    【解决方案3】:

    您的脚本正在通过 管道less 通信。管道是连接两个端点的内存中字节流:您的脚本和less 程序,前者向其写入输出,后者从其读取。

    由于管道是在内存中的,如果它们变得任意大,那将是不愉快的。因此,默认情况下,在任何给定时刻,管道内(已写入但尚未读取)的数据是有限的。默认情况下,它在 Linux 上是 64k。如果管道已满,并且您的脚本尝试写入它,则写入会阻塞。所以你的脚本实际上并没有工作,它在调用write() 时停止了

    如何克服这个问题?调整默认值是一个糟糕的选择;相反,使用的是在读取器中分配一个缓冲区,以便它读入缓冲区,释放管道,从而让写入程序工作,但只向您显示(或处理)输出的一部分。 less 有这样一个缓冲区,并且默认情况下会自动扩展它,但是它不会在后台填充它,它只会在您读取输入时填充它。

    那么解决您的问题的方法是读取文件直到结束(就像您通常按 G 一样),然后回到开头(就像您通常按 g)。问题是您可以像这样通过命令行指定这些命令:

    ./script | less +Gg
    

    但是,您应该注意,您必须等到整个脚本的输出加载到内存中,因此您无法立即查看它。 less 不够成熟。但如果这是您真正需要的(在 ./script 仍在计算其结尾时浏览输出的开头),您可能需要使用临时文件:

     ./script >x & less x ; rm x
    

    【讨论】:

    • 如果脚本写入标准输出并在两者之间出现段错误怎么办。 segfault 可以防止缓冲的输出被写入文件 x。这是因为默认情况下,文件的输出是块缓冲的,而不是行缓冲的。我可以在脚本上从外部强制行缓冲吗?我可以使用现成的伪 tty 实用程序吗?
    【解决方案4】:

    对于一些背景信息,还有 Alexander Sandler 的一篇不错的文章,名为“How less processes its input”!

    http://www.alexonlinux.com/how-less-processes-its-input

    【讨论】:

      【解决方案5】:
      Can I externally enforce line buffering on the script? 
      Is there an off the shelf pseudo tty utility I could use? 
      

      您可以尝试使用script 命令打开行缓冲输出模式。

      script -q /dev/null ./script | less      # FreeBSD, Mac OS X
      script -c "./script" /dev/null | less    # Linux
      

      有关这方面的更多替代方案,请参阅:Turn off buffering in pipe

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-17
        • 1970-01-01
        • 2021-04-29
        • 1970-01-01
        • 2022-10-24
        • 1970-01-01
        相关资源
        最近更新 更多