我正在做一个从日志中读取并通过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
的尾部不会显示任何内容,这就是为什么它无法工作的原因。
答案 0 :(得分:0)
在文件系统中的底层文件仅由数字标识,称为“ inodes”。然后,您有一个指向索引节点的文本标签,称为“文件名”。运行tail -f filename
时,您开始将文件拖到filename
当前指向的索引节点后面;这称为“打开file handle”,因为tail
程序通过“文件句柄”创建了对文件的开放引用。
您的情况是您开始拖尾一个文件。然后,您的日志记录应用程序(gedit :-))在不同的inode上创建了一个 new 文件,并对其进行了 changed 更改(emode filename
所指)。您要拖尾的inode上的文件仍然存在,因为tail
仍具有打开的文件句柄,只有在所有程序关闭其文件句柄后,该文件才会被删除。但是任何尝试打开文件的新程序都将进入新的inode。
要解决此问题,您需要以“附加模式”(还有其他模式)打开文件。 “追加模式”表示您将数据推送到文件的末尾而没有创建新的索引节点。所有实际的日志记录应用程序都将执行此操作,因为它比每次重写整个文件都要快得多。