如何持续监控一个被不断覆盖的文件?具体来说,该文件包含一行文本,后台进程正在反复打开和重写。
我本来希望tail -F
它能起作用,但是没有。
更新:我希望这不会有什么问题,但我正在运行 Mac OS X 10.5.8。
答案1
您可以使用 watch 来重复执行命令,因此对于您的情况
watch -n 1 cat filename
答案2
有更好的方法可以做到这一点,但它会起作用
while true ; do echo -n "`date +%s:` " >> file.log ; cat file >> file.log ; done
file.log文件将会快速增长……
如果您需要更多功能,例如检查文件内容是否与之前的内容相同,您可以将其扩展为脚本。只需在下面发表评论,我就会提供帮助。
答案3
在 BSD 系统上(我相信大多数其他系统也是如此),tail -f
如果发现文件已被截断,则会重置到文件的开头(这听起来正是您想要的行为)。
在 Linux 系统上也会发生同样的事情,但至少在我使用的 Debian 机器上,tail 有一个“轮询间隔”,因此您需要告诉它不要在检查文件之间休眠(tail -s 0 -f ...
)以便它注意到截断,否则会发生奇怪的事情(如果文件在写出时大小相同或更小,则不会得到任何输出,如果文件更大,您将获得 tail 当前字节数标记之后的所有内容,等等——使用您的 tail 实现来查看它的行为)
作为 Linux 和 BSD 系统上的替代方案,tail 有一个-F
选项(类似于,-f
但会检查文件是否已旋转 -- 即名称指向不同的 inode 编号)。但如果文件被截断而不是取消链接并替换,这将对您没有帮助。
答案4
您可以使用FSEvents API以及一个用于监视文件(或更准确地说是包含该文件的目录)的小脚本。