假设我有一个日志文件,我想读取、追踪并偶尔搜索其中的模式。日志文件会不时轮换(取决于多种因素)。使用
os.OpenFile
读取文件时,甚至使用 Syscall.Open 和 O_RDONLY|O_NONBLOCK 读取文件时,无法移动或删除该文件。我知道像 filebeat 这样的程序可以处理这个问题,但我还没有找到一种方法来在我的程序打开文件时成功地操作该文件。
fd, err := syscall.Open("server.log", syscall.O_RDONLY|syscall.O_NONBLOCK, 0700)
defer syscall.Close(fd)
buf := make([]byte, 1024)
syscall.Read(fd, buf)
// breakpoint after here, trying to manipulate the file manually via terminal: mv/rm
filebeat 等程序如何在文件被删除时保持文件打开状态以供读取?
尝试过:
我能想到的解决方案是拥有某种文件管理器来注册我想要读取的文件,并检查文件是否已更改(并且知道读取器的状态)。如果我想阅读,我会分块阅读。必须有一些围绕解析的解决方法,但这是单独的问题。
谢谢你。
操作系统:Fedora 工作站 40
# rm server.log
rm: remove regular file 'server.log'? y
rm: cannot remove 'server.log': Text file busy
mv-ing 文件产生相同的结果
好吧,我发现问题了。由于我的工作笔记本电脑运行 Windows,并且我在其上运行 fedora VM,因此我已在 VM 中安装了我的项目文件夹(包括测试数据、server.log)。但是,由于 ntfs、VirtualBox 和 fedora 之间存在一些不匹配,我无法删除该文件。将文件移至主机虚拟机解决了该问题。