查找读写指定文件的进程

今天遇到一个问题,需要知道读写某个特定文件的进程是哪个。开始找到inotify,发现它确实能监控文件的读写等一系列事件,但它只能告知制造这些事件的用户id,而没有进程id。这时候想到lsof, 它能列出当前所有被打开的文件及打开进程的信息。那么在收到inotify事件通知后,执行lsof不就能知道进程信息了,抱着这个想法写了个python脚本,结果发现屁用没有。因为大多数修改文件的过程,都是修改完后立刻关闭文件的,收到inotify事件通知再去执行lsof几乎得不到任何有用信息。

正在陷入困境之际,网上找到了答案。只要执行如下命令:

/sbin/auditctl -w 文件路径 -p war

等到文件改变后,执行:
/sbin/ausearch -f 文件路径

就能知道到底是哪个进程修改了这个文件。ausearch的输出信息很多,可以用more或倒到一个文件里慢慢看。
看完后执行
/sbin/auditctl -D

以删除所有监控规则。

在CENTOS 6.4 测试通过。