![查找哪个进程正在修改文件](https://linux22.com/image/3723/%E6%9F%A5%E6%89%BE%E5%93%AA%E4%B8%AA%E8%BF%9B%E7%A8%8B%E6%AD%A3%E5%9C%A8%E4%BF%AE%E6%94%B9%E6%96%87%E4%BB%B6.png)
我们的生产服务器上的特定文件正在明显随机的时间被修改,这似乎与任何日志活动无关。我们无法弄清楚是什么程序在做这件事,而且有很多嫌疑。我怎样才能找到罪魁祸首?
它始终是相同的文件,位于相同的路径,但位于不同的服务器和不同的时间。这些盒子由以下人员管理木偶,但 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