zoukankan      html  css  js  c++  java
  • 常用命令--stdbuf

    缓冲类型分为三种:

    • 无缓冲
    • 行缓冲
    • 全缓冲

    stderr默认缓冲就是无缓冲。而stdout的缓冲类型与输出介质有关:

    • 屏幕或者终端:行缓冲
    • 重定向文件、管道:全缓

    一般情况下程序输出介质都是屏幕或者终端,采用的都是行缓冲,也就是实时输出。但是当程序输出介质为重定向文件或者管道时,内核为了性能优化,可能变成非实时的。究其原因也就是因为pipe的缓冲区问题。

    如下,发现没有任何输出。

    tailf access.log | cut -d' ' -f1 | uniq
    

    主要原因

    首先tail程序通过read调用读取文件中的内容,然后将读取的数据写入stdout,由于tail的输出是管道,需要拷贝到内核。(tail程序比较特殊,在有新数据产生时,会主动调用fflush,刷新缓冲区。),内核中第一个缓冲区如果不写满,cut程序便读取不到tail写入的数据(原因1)。由于cut程序本身也是缓冲的(原因2),输出是管道,这里也会等待缓冲区满(原因3),uniq程序才能读取到数据。最终导致了没有任何输出。类似的程序还有 tcpdump -l ,grep --line-buffered , sed --unbuffered 提供了参数使其变成非缓冲的。

    使用stdbuf命令则可以不要缓冲,实时输出即可。

    • 使用如下命令,即可实现新产生的日志也能够实时输出。

    tail -f access.log | stdbuf -oL cut -d' ' -f1 | uniq
    

    其中的参数,o表示输出流,L表示行缓冲。 这样主要遇到换行符,就会将缓冲输出到指定对象。而不会等到缓冲区完全写满后,才让下游读取。

    • 使用如下命令,可实时监听并过滤日志信息输出。

    tail -f access.log |grep '/login'
    


    作者:Outsrkem
    出处:https://www.cnblogs.com/outsrkem/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    hdu 5119 Happy Matt Friends
    hdu 5128 The E-pang Palace
    hdu 5131 Song Jiang's rank list
    hdu 5135 Little Zu Chongzhi's Triangles
    hdu 5137 How Many Maos Does the Guanxi Worth
    hdu 5122 K.Bro Sorting
    Human Gene Functions
    Palindrome(最长公共子序列)
    A Simple problem
    Alignment ( 最长上升(下降)子序列 )
  • 原文地址:https://www.cnblogs.com/outsrkem/p/11200697.html
Copyright © 2011-2022 走看看