gpt4 book ai didi

linux - 在 shell 脚本中退出 tail -f

转载 作者:太空狗 更新时间:2023-10-29 12:03:53 24 4
gpt4 key购买 nike

我似乎无法完成这项工作。这是脚本。

tail -fn0 nohup.out | while read line; do

if [[ "${line}" =~ ".*ERIKA.*" ]]; then

echo "match found"
break

fi

done

echo "Search done"

即使找到匹配项,代码echo "Search done" 也不会运行。我只想在找到匹配项时运行其余代码。我还没有让它成为可能。

抱歉,我是日志监控新手。有什么解决方法吗?

我将通过 Jenkins 运行脚本,所以代码应该是自由流动的并且不需要任何用户交互。

请帮忙,谢谢。

最佳答案

这里有几个问题:

  1. tail 将继续运行,直到它无法写入其输出管道,因此您的管道在 tail 退出之前不会完成。它不会这样做,直到您的脚本退出,并且另一行(如果缓冲可能是 4K,见下文)被写入日志文件,导致它尝试写入其输出管道。 (重新缓冲:大多数程序在通过管道写入时都切换到 4K 缓冲。除非 tail 显式设置其缓冲,否则这会影响上述行为)。

  2. 您的正则表达式:"${line}"=~ ".*ERIKA.*" 与我不匹配。但是,"${line}"=~ "ERIKA" 确实匹配。

您可以使用 tail 的 --pid 选项作为第一个问题的解决方案。这是一个示例,修改您的脚本以使用该选项:

while read line; do
if [[ "${line}" =~ "ERIKA" ]]; then
echo "match found"
break
fi
done < <(tail --pid=$$ -f /tmp/out)

echo "Search done"

Glenn Jackman 的 pkill 解决方案是另一种终止尾部的方法。

也许考虑用 bash 以外的东西来做这个:perl 有一个很好的 File::Tail实现尾部行为的模块。

与此问题相关的问题还有很多,您可能会在他们的答案中找到您喜欢的内容:

关于linux - 在 shell 脚本中退出 tail -f,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22537591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com