SSH执行日志查询命令有时未等待60秒的原因排查
命令异常行为的原因分析
先拆解你这条命令的实际运行逻辑,再解释为什么会出现有时等60秒、有时不等的情况:
关键环节的作用:
tail -f temp.csv:持续跟踪temp.csv的新增内容,会一直运行直到被信号终止。timeout 60s tail -f ...:给tail进程设置60秒超时,时间到就主动杀死该进程。grep -w -m 1 'message':找到第一个匹配message的行就立刻停止运行。
两种行为的触发逻辑:
- 不用等60秒的情况:如果
grep很快在tail输出的新增内容里找到匹配行,会因为-m1参数直接退出。此时grep后续的管道进程(awk和tac)也会跟着结束,前面的tail -f会因为自身标准输出管道被关闭(没有进程再读取它的输出),收到系统的SIGPIPE信号直接终止,整个命令链提前结束,自然不用等满60秒。 - 要等60秒的情况:如果
grep始终没找到匹配行,会持续等待tail的输出。tail -f会一直跟踪文件,直到第一个timeout的60秒时限到了,timeout杀死tail进程。tail终止后,grep失去输入来源也会退出,整个命令才结束,所以会等满60秒。
- 不用等60秒的情况:如果
额外提个逻辑问题:你命令开头的tac temp.csv完全无效,因为tail -f temp.csv是直接读取文件本身,不会从标准输入读取数据,所以tac输出的已有文件内容全部被丢弃了——这条命令实际只检查了执行之后新增的日志,没有覆盖文件里已有的内容。
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

