让 bash 脚本针对实时文件运行-可能吗?

让 bash 脚本针对实时文件运行-可能吗?

我编写了一个脚本,只要我在静态文件上运行它,它(最终)就能按我想要的方式运行。有没有办法对实时文件进行 tail 操作,并让脚本在实时文件的每一行进入时对 tail 文件执行操作?

我试过

tail -f logfile.txt | ./myscript.sh

./myscript.sh <logfile.txt

但它们似乎都没有产生预期的结果。我的猜测是(在第一个示例中)myscript.sh 直到 tail -f 完成才会运行,这违背了目的 :)

我不知道为什么第二个例子不起作用......似乎应该起作用,但它读取了文件的所有内容,但没有读取进入 logfile.txt 的新行

答案1

这是一个简单的概念验证:

在 myscript.sh 中:

#!/bin/bash

while read -r line; do
  echo "syslog says: $line"
done

然后在终端中:

$ tail -n 0 -F /var/log/syslog | ./myscript.sh

(请注意,我之所以使用是-n 0因为我不想处理任何之前的日志内容;如果你想处理它全部然后将其更改为-n +1从第一行开始执行尾部操作)。我还使用了-F而不是-f,这样如果原始文件变得无法访问(例如由于被轮换出),尾部将重试。

在不同的终端

$ logger "logger says hello"

你应该立即在第一个终端中看到类似

syslog says: Dec 11 13:48:54 T61p steeldriver: logger says hello

如果它不起作用,也许是因为写入日志文件的任何内容都是以缓冲方式进行的,或者您在脚本中以缓冲方式处理它(grep有时是罪魁祸首:它有一个--line-buffered在这种情况下可能有用的选项)。

相关内容