尾巴-f不显示最后几行

时间:2018-10-26 09:57:06

标签: bash

我正在做一个从日志中读取并通过netcat发送线路的脚本

tail -f /tmp/archivo.txt | grep --line-buffered status=bounced | while read LINE0 
do 
    echo "${LINE0}"
    echo "${LINE0}" > /tmp/mail-line.log
    netcat localhost 5699 < /tmp/mail-line.log 
    sleep 1s
done

当我第一次启动该脚本时,它会正确发送数据,但是当引入新行时,除非重新启动该脚本,否则它将无法正常工作,有什么想法吗? 谢谢。

编辑:

@Kamil Cuk问我,我尝试仅做回声,但没有用

发生了什么事?:

好吧,我正在使用gedit引入新数据,但这在-f标志下却不起作用,而是在-F标志下起作用,因为它表明archivo.txt已被替换。我尝试做echo "New line with bounce=status" >> archivo.txt",它奏效了。因此,我假设gedit会以某种方式更改元数据,而-f的尾部不会显示任何内容,这就是为什么它无法工作的原因。

1 个答案:

答案 0 :(得分:0)

在文件系统中的底层文件仅由数字标识,称为“ inodes”。然后,您有一个指向索引节点的文本标签,称为“文件名”。运行tail -f filename时,您开始将文件拖到filename当前指向的索引节点后面;这称为“打开file handle”,因为tail程序通过“文件句柄”创建了对文件的开放引用。

您的情况是您开始拖尾一个文件。然后,您的日志记录应用程序(gedit :-))在不同的inode上创建了一个 new 文件,并对其进行了 changed 更改(emode filename所指)。您要拖尾的inode上的文件仍然存在,因为tail仍具有打开的文件句柄,只有在所有程序关闭其文件句柄后,该文件才会被删除。但是任何尝试打开文件的新程序都将进入新的inode。

要解决此问题,您需要以“附加模式”(还有其他模式)打开文件。 “追加模式”表示您将数据推送到文件的末尾而没有创建新的索引节点。所有实际的日志记录应用程序都将执行此操作,因为它比每次重写整个文件都要快得多。