【问题标题】:tail dynamically created files in linux在linux中tail动态创建文件
【发布时间】:2015-12-02 06:29:51
【问题描述】:

我有一个目录下的文件列表,如下所示,

file1
file2
file3
....
....

文件将由进程动态创建。

现在当我做tail -f file* > data.txt

file* 只获取目录中的现有文件。

对于(例如)

现有文件:

file1
file2

我愿意:tail -f file* > data.txt

当 tail 处理一个名为 file3 的新文件时,

(这里我需要在尾部也包含 file3 而无需重新启动命令)

但是我需要停止 tail 并重新启动它,以便动态创建的文件也被拖尾。

有没有办法在创建新文件或任何解决方法时在尾部动态包含文件。

【问题讨论】:

  • 您总是可以将原始文件列表写入 temp 文件,使用tail 等处理文件,然后将现在存在的文件与其中的文件进行比较温度。如果不同,则更新您的 temp 文件,并将任何新创建的文件添加到您的输出中。

标签: linux tail


【解决方案1】:

我有一个可以满足您大部分但不是全部要求的anwser:

你可以使用

tail -f --follow=name --retry file1 file2 file3 > data.txt

这将继续打开文件 1、2、3,直到它们可用。即使一个文件消失并再次出现,它也会继续打印输出。

示例用法:

首先创建两个虚拟文件:

echo a >> file1
echo b >> file2

现在使用 tail(在单独的窗口中):

tail -f --follow=name --retry file1 file2 file3 > data.txt

现在追加一些数据并进行一些其他操作:

echo b >> file2
echo c >> file3
rm file1
echo a >> file1

现在这是最终输出。请注意,所有三个文件都被考虑在内,即使它们在某个时刻不存在:

==> file1 <==
a

==> file2 <==
b
tail: cannot open ‘file3’ for reading: No such file or directory

==> file2 <==
b
tail: ‘file3’ has become accessible

==> file3 <==
c
tail: ‘file1’ has become inaccessible: No such file or directory

==> file1 <==
a

备注:这不适用于file*,因为这是在执行前扩展的全局模式。假设你这样做:

tail -f file*

并且只有 file1 和 file2 存在;然后tail 作为输入:

tail -f file1 file2

glob 扩展无法知道哪些文件最终会匹配该模式。所以这是一个部分答案:如果您知道将要创建的所有可能的文件名称;这样就可以了。

【讨论】:

  • +1 for answer ,在我的情况下,它会继续创建文件 直到过程结束,所以我无法预测文件名。
  • 我想是的,这就是为什么我注意到这可能只是部分答案。问题是它永远不会与 glob 模式 file* 一起使用,因为它在执行时会扩展......也许在编写脚本时......?
【解决方案2】:

您可以使用inotifywait 通知您在目录中创建的任何文件。读取输出并启动一个新的tail -f 作为创建每个新文件的后台进程。

【讨论】:

    猜你喜欢
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2012-12-29
    • 2013-06-19
    相关资源
    最近更新 更多