问题场景与核心痛点
在服务器运维和开发调试过程中,我们经常遇到需要定位某个文件的创建者或读写进程的情况。比如:
- 临时目录突然出现大量垃圾文件
- 日志文件被异常修改
- 磁盘空间被未知进程占用
实时监控文件操作
使用inotifywait
工具实时监控文件事件:
# 安装inotify-tools
sudo apt-get install inotify-tools
# 监控指定文件的创建/修改/删除事件
inotifywait -m /path/to/file -e create,modify,delete
历史操作追踪方案
如果文件已经存在,可以通过审计子系统查看历史记录:
# 启用审计系统
sudo auditctl -w /path/to/file -p war -k file_monitor
# 查看审计日志
ausearch -k file_monitor | aureport -f -i
lsof的进阶用法
当文件正在被进程使用时,lsof是最直接的排查工具:
# 查看正在使用文件的进程
lsof /path/to/file
# 监控文件被打开的事件
lsof +r 1 /path/to/file
内核级追踪方案
对于复杂的生产环境问题,可以使用systemtap进行深度追踪:
# 安装systemtap
sudo apt-get install systemtap
# 创建追踪脚本
cat << 'EOF' > file_monitor.stp
probe syscall.open {
if (filename == "/path/to/file") {
printf("%s[%d] opened %s\n", execname(), pid(), filename)
}
}
EOF
# 运行脚本
stap file_monitor.stp
实际案例解析
某次线上事故排查示例:
# 发现异常日志文件
ls -lh /var/log/unknown.log
# 使用fuser查看占用进程
fuser -v /var/log/unknown.log
# 结合ps命令获取详细信息
ps aux | grep $(fuser /var/log/unknown.log 2>&1 | awk '{print $2}')