查找哪个进程正在修改文件

查找哪个进程正在修改文件

我们的生产服务器上的特定文件正在明显随机的时间被修改,这似乎与任何日志活动无关。我们无法弄清楚是什么程序在做这件事,而且有很多嫌疑。我怎样才能找到罪魁祸首?

它始终是相同的文件,位于相同的路径,但位于不同的服务器和不同的时间。这些盒子由以下人员管理木偶,但 puppet 日志显示文件修改时没有任何活动。

什么内核钩子、工具或技术可以帮助我们找到哪个进程正在修改这个文件?


lsof 不适合这种情况,因为文件的打开、修改和关闭速度非常快。任何依赖轮询的解决方案(例如经常运行 lsof)都是不好的。


  • 操作系统:Debian 测试
  • 内核:Linux,2.6.32 到 3.9,32 位和 64 位。

答案1

您可以使用auditd并添加一条规则来监视该文件:

auditctl -w /path/to/that/file -p wa

然后观察要写入的条目/var/log/audit/audit.log

答案2

如果您正在查找的程序仍然打开了该文件,您可以使用以下命令:

 sudo lsof /path/to/file/being/modified

您也可以在一个小循环中调用它,使用以下脚本getfileusers.sh

 #!/bin/sh

 FILE=$1

 while true; do
    lsof "${FILE}"
 done > /tmp/fileusers.log

然后调用它:

 sudo ./getfileusers.sh /path/to/file/being/modified

并最终检查/tmp/fileusers.log谁触摸了该文件......

答案3

SystemTap 可以做到这一点,使用索引节点监视脚本

答案4

如果您可以实时捕获它,即文件正在被访问,您可以通过运行 lsof 找到该进程:

$ while :; do echo foo >> bar.txt; done &
$ sudo lsof bar.txt
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
bash    25723 terdon    1u   REG    8,6  5015796 16647496 bar.txt

相关内容