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

问题描述 投票:0回答:1

通过 ssh 命令:

$ tac temp.csv |超时 60 秒 tail -f temp.csv |超时 60 秒 grep -w -m 1 '消息' | awk '{print}' | tac

在上面的命令中,我想在日志文件中搜索消息,但在点击此命令后,我想等待 60 秒,然后在 60 秒后,如果他找到任何结果,则返回该结果,否则返回空字符串。 但我在运行此命令后观察到,有时此命令会等待 60 秒,有时则不会,由于这个问题,我面临问题

有人可以告诉我为什么我观察到的这种行为有时会等待 60 秒,有时则不会......请帮助我?

linux unix ssh command
1个回答
0
投票

TL;博士

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

完整解决方案

我们应该解决的第一件事是正确使用

timeout
命令。 正如手册页所说:

超时 - 运行有时间限制的命令...启动命令,如果在持续时间后仍在运行,则终止它。

它并不是用作暂停按钮,而是“解除”过长过程的故障保护装置。与此相反,

sleep
命令恰好用于限时暂停。来自
sleep
的手册页:

睡眠 - 延迟指定的时间...暂停 NUMBER 秒。

这给我们带来了正确的命令,但是现在如何使用这个命令呢?如果我们天真地通过管道传输到

sleep
命令,我们将丢失通过管道传输到它的数据。可以这样看:

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

所以看一个相关的SO问题我们可以看到运行类似的东西:

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

可能有用。但是,在使用此解决方案时,您应该考虑括号中的哪些命令会将输入通过管道传输到括号内的命令中。由于我们没有使用

tee
或一些重定向技巧,因此只有一个输入,因此命令如下:

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

只会输出

dlrow olleh
。然后我们看到第一个“期望”输入的命令就是获取它的命令。

© www.soinside.com 2019 - 2024. All rights reserved.