如何精准追踪文件创建及读写进程:Linux系统下的实用排查指南


阅读 13 次

问题场景与核心痛点

在服务器运维和开发调试过程中,我们经常遇到需要定位某个文件的创建者或读写进程的情况。比如:

  • 临时目录突然出现大量垃圾文件
  • 日志文件被异常修改
  • 磁盘空间被未知进程占用

实时监控文件操作

使用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}')