V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
pythonee
V2EX  ›  Linux

ping 和 awk 给 ping 结果打上 timestamp,但是管道总是卡住的感觉

  •  
  •   pythonee · 2015-12-03 16:43:48 +08:00 · 3331 次点击
    这是一个创建于 3269 天前的主题,其中的信息可能已经有所发展或是发生改变。
    就是想实现 ping 的返回结果加上时间戳,输出到 terminal 和写入日志,首先反应就是下面的脚本

    ping www.baidu.com -i 2 | awk '{print strftime("%Y-%m-%d %H:%M:%S")"|"$0}'|tee -a ping.log

    但是这样执行总在开始时卡住,但是不是很明白为什么会卡住,如果把 ping 换成别的命令,就不会有这个问题,怀疑是 ping 的问题,然后 stackoverflow 启示了下,改成下面的脚本

    ping www.baidu.com -i 1 | while read pong; do echo "$(date +"%Y-%m-%d %H:%M:%S") | $pong"; done | tee -a ping.log

    这样就执行的非常好,还是第一次这么使用$pong ,这是为什么呢, ping 跟管道配合的不太好吗
    7 条回复    2015-12-10 09:48:16 +08:00
    dant
        1
    dant  
       2015-12-03 16:54:34 +08:00
    flush
    octopus_new
        2
    octopus_new  
       2015-12-03 17:02:25 +08:00
    awk 执行是在针对输出结果操作,你的 ping 并没有结束,所以 awk 一直都不会被执行,看上去‘死掉了’。实际上你给 ping 加一个 ’-c 次数‘ 参数之后你的命令就可以执行了。
    octopus_new
        3
    octopus_new  
       2015-12-03 17:04:37 +08:00
    针对我以上说的,虽然执行了,但是结果可能不是你想要的,因为 awk 只是针对结果操作,而不是实时对 ping 进行打标签操作。
    Arthur2e5
        4
    Arthur2e5  
       2015-12-09 02:41:56 +08:00
    缓冲区要绕过有一些 hack 的程序的,例如系统多半自带的 stdbuf : https://www.gnu.org/software/coreutils/manual/html_node/stdbuf-invocation.html

    @octopus_new 什么啊,明明是输入输出缓冲区的锅子……

    @dant bingo
    pythonee
        5
    pythonee  
    OP
       2015-12-09 10:22:24 +08:00
    @octopus_new 其实我当时也是这么想的,但是加了-c 并没有什么用
    pythonee
        6
    pythonee  
    OP
       2015-12-09 10:22:40 +08:00
    @Arthur2e5 用了$pong 就好使了,这是为啥咧
    Arthur2e5
        7
    Arthur2e5  
       2015-12-10 09:48:16 +08:00 via Android
    @pythonee 1. 你没看清本质,本质是 read 2. 因为 shell read 和 echo 就是这样行缓冲玩的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1474 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 17:25 · PVG 01:25 · LAX 09:25 · JFK 12:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.