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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    深入了解抽象类和接口
    关于Hibernate查询对象调用set方法自动同步到数据库解决方案
    【鸽子的迷信(一)】python导入由excel文件改后缀变成的csv文件出现乱码错误(ParserError:Error tokenizing data. C error:)
    《计算机操作系统》CH1操作系统引论思维导图整理
    IntelliJ IDEA创建一个Maven项目
    C++实验三
    小练习
    C++实验二
    C++的ch1&ch2的整理
    C++实验一
  • 原文地址:https://www.cnblogs.com/outsrkem/p/11200697.html
Copyright © 2011-2022 走看看