如何按照正则表达式跟踪动态创建的文件



我正在尝试使用命令跟踪bin/bash中动态创建的文件

tail -f /data/logs*.log

但它并没有跟踪运行时创建的文件。

例如,如果已经存在两个文件logs1.log和logs2.log,并且在一段时间后如果在运行时创建了logs3.log。

它没有跟踪logs3.log


跟踪这种动态创建的文件的方法是什么?

这不起作用,因为bash通配符*只解析一次。它生成了已经存在的文件列表。此列表将不再更新。所以你的整行tail -f /data/logs*.log都被类似tail -f /data/logs/logs1.log /data/logs2.log /data/logs3.log的东西取代了。然后执行该命令。通常,在执行命令之前,您必须将通配符理解为预处理。

你想要什么需要更多的努力。您的命令已适用于已存在的文件。到目前为止还不错。但你需要更多。因此,您必须通过添加&将tail命令发送到后台。试试看:

tail -f /data/logs*.log &
sleep 2s
echo something more

但不是写";更多的东西;您想要监听新文件,同时跟踪-f文件。如何做到这一点,你可以在这里找到:https://unix.stackexchange.com/questions/24952/script-to-monitor-folder-for-new-files

随着时间的推移,您将拥有越来越多的流程。假设你通常只有几个新文件,这不会是个问题。但是,如果您有数百或数千个新文件,则必须为解决方案花费更多精力。

你可以尝试这样的方法,但它有一些问题(见下文(:

#!/bin/bash
pid=
dir="$1"
handle_sigint() {
kill $pid 2>/dev/null
exit
}
trap handle_sigint SIGINT SIGTERM
while true; do
tail -n1 -f "$dir"/*.log &
pid=$!
inotifywait -q -e create "$dir"
kill $pid 2>/dev/null
done

通过将所需目录作为第一个参数来运行它。

遗憾的是,即使删除了tail命令中的-n1参数,也可能会丢失一些日志行,特别是如果新文件在创建时有许多行是直接写入的。

最新更新