watch与lsof、grep组合使用无输出,是否存在兼容性问题?
问题原因
不是watch和lsof、grep不兼容,是你写的命令的执行优先级不符合预期。
shell在解析命令时,管道|的优先级高于普通参数解析,你写的watch lsof -p 3536693 | grep snapshot会被拆分为两个独立执行的部分:
- 前台执行
watch lsof -p 3536693,把它的标准输出作为管道输入 - 后台执行
grep snapshot,过滤前面watch的输出
而watch默认会输出终端清屏、光标定位等控制序列,且本身是持续运行的全屏幕交互程序,输出内容不会被grep正常识别匹配,所以看不到结果。
解决方法
把需要watch重复执行的**完整命令(包含管道部分)**用引号包裹,作为watch的单个参数传入即可:
watch 'lsof -p 3536693 | grep snapshot'
如果还是没有输出,可以给grep加上行缓冲参数避免输出缓冲阻塞:
watch 'lsof -p 3536693 | grep --line-buffered snapshot'
如果需要调整刷新间隔,可加-n 秒数参数,下面是每秒刷新一次的示例:
watch -n 1 'lsof -p 3536693 | grep snapshot'
内容的提问来源于stack exchange,提问作者CrazyRabbit
相关产品推荐
相关产品推荐

