我正在尝试使用命令跟踪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
参数,也可能会丢失一些日志行,特别是如果新文件在创建时有许多行是直接写入的。