如何监控打开的文件

是否有工具来监视哪些进程打开系统上的文件,以便您可以跟踪哪个进程一直在触摸特定文件?

Lsof可以在进程打开文件的同时查看是否运行它,但如果它是一个偶尔运行的短暂进程,则无法用lsof捕获它。 需要使用内核跟踪的东西。

您也许可以使用审计系统。 这是一个小重量级,但这样的东西应该工作(在/etc/audit/audit.rules):

# delete all other rules -D # watch the file in question -w /path/to/file -p rwxa 

然后我认为你需要重新启动auditd:

 sudo service audit restart 

(如果你没有安装它,它在包审计中。)然后可以在/var/log/audit/audit.log中找到罪魁祸首。

不幸的是,Linux用来允许监视文件的机制是inotify,它没有提供足够的信息来提取有用的数据:你只获得文件名和已完成的操作。

我试过用这样的东西:

 sudo inotifywait -mr somedir --format "%w%f" | while read file; do echo -n "$file => ";lsof -b $file; echo ""; done 

这会侦听指定目录上的inotify事件,并为每个事件运行lsof以尝试捕获触及该文件的进程。 不幸的是,对于我测试的大多数访问(例如使用编辑器写入文件),LSOF命令只是缓慢而无法捕获有问题的进程。

如果您的进程对有问题的文件执行更密集的IO,那么您的里程可能会有所不同。 祝好运。