带重定向的grep过滤ping输出无法写入日志文件的问题求助
带重定向的grep过滤ping输出无法写入日志文件的问题求助
问题描述
我执行命令:
ping www.google.com |grep -v "time=1." >>ping.log,但日志文件里完全没有内容;如果去掉重定向(直接运行ping www.google.com |grep -v "time=1."),命令能正常输出结果。请问我哪里操作错了?
问题原因
这其实是程序缓冲机制搞的鬼!当程序的输出目标是终端时,默认会用「行缓冲」——每输出一行就立刻显示出来;但如果输出是管道或者文件,很多程序会切换成「全缓冲」,也就是要攒够一大块数据(通常是4KB左右)才会把内容传递下去或者写入文件。
你直接在终端运行时,ping和grep都用行缓冲,所以每一行符合条件的输出都会立刻显示;但加了重定向后,ping会把输出攒起来,没达到缓冲大小就不会传给grep,自然日志文件里啥也没有。
解决办法
给你几个实用的方案,选一个适合你的就行:
用
stdbuf强制设置行缓冲
这个命令可以修改程序的缓冲行为,让ping始终用行缓冲输出:stdbuf -oL ping www.google.com | grep -v "time=1." >> ping.log其中
-oL的意思是把标准输出(stdout)设置为行缓冲。用
unbuffer模拟终端输出
如果你的系统装了expect工具包(很多Linux发行版默认自带),可以用unbuffer让ping以为自己在输出到终端,从而保持行缓冲:unbuffer ping www.google.com | grep -v "time=1." >> ping.log修改
ping的参数(临时方案)
有些版本的ping支持-c参数指定发送次数,当所有ping包发送完成后,缓冲会自动刷新到日志:ping -c 10 www.google.com | grep -v "time=1." >> ping.log不过这个方案只适合一次性ping固定次数的场景,不适合持续ping的需求。
备注:内容来源于stack exchange,提问作者Gunnar
相关产品推荐
相关产品推荐

