unix 下面的ssh命令有时不等待60秒,直到日志文件完成其60秒,但它有时等待,为什么?

w8f9ii69  于 7个月前  发布在  Unix
关注(0)|答案(1)|浏览(94)
    • ssh使用的命令:**
$ tac temp.csv | timeout 60s tail -f temp.csv | timeout 60s grep -w -m 1 'message' | awk '{print}' | tac

字符串
在上面的命令中,我想在日志文件中搜索一条消息,但在运行此命令后,我想等待60秒,然后,在60秒后,如果命令找到任何结果,返回该结果,否则返回空字符串。但我在运行此命令后观察到的是,有时此命令等待60秒,有时不会。由于这种行为,我正面临一个问题。
有没有人能告诉我,为什么我观察到的这种行为会发生?有时它会等待60秒,有时不会。

ne5o7dgx

ne5o7dgx1#

TL;DR

tac temp.csv | (sleep 60; tail -f temp.csv) | timeout 60s grep -w -m 1 'message' | awk '{print}' | tac

字符串

完整解决方案

我们首先要解决的是timeout命令的正确用法。如手册页所述:
timeout -运行一个有时间限制的命令...启动COMMAND,如果在DURATION之后还在运行,就终止它。
它并不是用来作为一个暂停按钮,而是一个故障保护机制,用来“解除”一个过长的进程。与此相反,sleep命令,是专门用于一个有时间限制的暂停。从sleep的手册页:
睡眠-延迟指定的时间量.
这将我们带到正确的命令,但现在如何使用这个命令?如果我们天真地通过管道传输到sleep命令,我们将丢失传输到它的数据。这可以看起来像这样:

echo "hello world" | rev | sleep 2 | rev


因此,看看一个相关的SO问题,我们可以看到,运行类似于:

tac temp.csv | (sleep 60; tail -f temp.csv) | timeout 60s grep -w -m 1 'message' | awk '{print}' | tac


可能会起作用。但是,当使用这种解决方案时,您应该考虑括号中的哪个命令将输入到括号中的命令中。由于我们没有使用tee或一些重定向技巧,因此只有一个输入,因此命令如下:

echo "hello world" | rev | (tac; rev)


将只输出dlrow olleh。因此,我们看到第一个“期望”输入的命令是获得它的命令。

相关问题