tee -a 不重新创建文件

han*_*ans 7 rm tee

我在 Raspberry Pi 3 Debian 最新版本上运行以下命令:

cat /dev/ttyUSB0 | tee -a /media/pi/KINGSTON/klima.out | grep -F $ | tee -a /media/pi/KINGSTON/log
Run Code Online (Sandbox Code Playgroud)

该命令工作正常并执行它应该做的事情;但是,当我删除(手动或通过 CRON)该klima.out文件时,它不会重新创建。命令继续运行,日志文件继续附加,但klima.out文件没有返回。(也没有缓冲)。我想每周删除一次,因为它不让它跨越所有界限。有什么建议?

Kus*_*nda 19

我假设您的管道运行了很长时间,并且您试图在它运行时删除日志文件。

当您删除该文件时,该tee进程仍将其打开进行写入,这意味着磁盘空间不会交还给系统。直到所有引用该文件的打开文件描述符都关闭时才会发生这种情况。

写入已删除的文件是完全可以的,只要在删除之前分配了文件描述符。

您必须重新启动管道才能重新创建文件,并允许回收旧的(现在无名的)日志文件占用的空间。

为避免重新启动管道,您可以选择截断文件,即将其大小缩减为零而不删除它。这将允许tee继续追加到文件而无需重新打开它。

截断文件可以像 jlliagre 在他的回答中显示的那样完成,或者通过使用truncate(一个非标准实用程序,它是 GNU coreutils 的一部分):

truncate -s 0 /media/pi/KINGSTON/klima.out
Run Code Online (Sandbox Code Playgroud)

有关该实用程序的更多信息,请参阅手册truncate


jll*_*gre 13

如果要恢复文件块,则需要清空文件,而不是取消链接:

这种便携方式应该适用于大多数 shell:

: > /media/pi/KINGSTON/klima.out
Run Code Online (Sandbox Code Playgroud)

取消链接文件(即rm)会删除目录条目,但不会影响文件内容(inode),只要文件由读取器或写入器保持打开状态。

  • `:` 是空命令,即它不执行任何特定操作。这里使用的唯一功能是由 shell 提供的:重定向是将文件重置为空内容。 (3认同)
  • @jlliagre 你在这两点上都是完全正确的。 (3认同)