提问人:Coder 提问时间:10/29/2023 最后编辑:UberhumusCoder 更新时间:11/3/2023 访问量:82
在 ssh 命令下,有时不等待 60 秒,直到日志文件完成 60 秒,但有时它会等待为什么?
Below ssh command sometimes not waiting for 60s till log file finishes its 60s, but it waits sometimes why?
问:
通过 ssh 使用的命令:
$ tac temp.csv | timeout 60s tail -f temp.csv | timeout 60s grep -w -m 1 'message' | awk '{print}' | tac
在上面的命令中,我想在日志文件中搜索消息,但是在运行此命令后,我想等待 60 秒,然后在 60 秒后,如果命令找到任何结果,则返回该结果,否则返回空字符串。 但是我在运行此命令后观察到的是,有时此命令会等待 60 秒,有时不会。由于这种行为,我遇到了一个问题。
有人能告诉我为什么会发生这种行为吗?有时它会等待 60 秒,有时不会。
答:
1赞
Uberhumus
10/29/2023
#1
TL的;博士
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
睡眠 - 延迟指定的时间......暂停 NUMBER 秒。
这给我们带来了正确的命令,但是现在如何使用这个命令呢?如果我们天真地通过管道传递到命令,我们将丢失通过管道传递给它的数据。这可以这样看: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
评论