是否有一个工具可以监视哪些进程打开了系统上的哪些文件,以便您可以追踪哪个进程不断接触特定文件?
如果您在进程打开文件时运行了该进程,lsof 可以发现这一点,但如果该进程是短暂的,每隔一段时间运行一次,则无法使用 lsof 捕获它。需要使用内核跟踪的程序。
答案1
您也许可以使用审计系统。它有点繁重,但类似这样的方法应该可以工作(在 /etc/audit/audit.rules 中):
# delete all other rules
-D
# watch the file in question
-w /path/to/file -p rwxa
然后我认为您需要重新启动 auditd:
sudo service audit restart
(如果您没有安装它,它位于 auditd 包中。)然后可以在 /var/log/audit/audit.log 中找到罪魁祸首。
答案2
fnotifystat 是一个用于监视 Linux 文件活动的工具
sudo apt-get install fnotifystat
sudo fnotifystat
Total Open Close Read Write PID Process Pathname
7.0 1.0 1.0 5.0 0.0 2075 libvirtd /proc/cpuinfo
6.0 2.0 2.0 2.0 0.0 2075 libvirtd /sys/devices/system/cpu/cpu0/topology/physical_package_id
6.0 2.0 2.0 2.0 0.0 2075 libvirtd /sys/devices/system/cpu/cpu1/topology/physical_package_id
6.0 2.0 2.0 2.0 0.0 2075 libvirtd /sys/devices/system/cpu/cpu2/topology/physical_package_id
6.0 2.0 2.0 2.0 0.0 2075 libvirtd /sys/devices/system/cpu/cpu3/topology/physical_package_id
4.0 1.0 1.0 2.0 0.0 2075 libvirtd /sys/devices/system/node
4.0 1.0 1.0 2.0 0.0 2075 libvirtd /sys/devices/system/node/node0
4.0 2.0 2.0 0.0 0.0 15313 gnome-calendar /usr/share/zoneinfo/Europe/London
3.0 1.0 1.0 1.0 0.0 2075 libvirtd /sys/devices/system/cpu/cpu0/topology/core_id
3.0 1.0 1.0 1.0 0.0 2075 libvirtd /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
3.0 1.0 1.0 1.0 0.0 2075 libvirtd /sys/devices/system/cpu/cpu1/topology/core_id
3.0 1.0 1.0 1.0 0.0 2075 libvirtd /sys/devices/system/cpu/cpu1/topology/thread_siblings_list
3.0 1.0 1.0 1.0 0.0 2075 libvirtd /sys/devices/system/cpu/cpu2/topology/core_id
3.0 1.0 1.0 1.0 0.0 2075 libvirtd /sys/devices/system/cpu/cpu2/topology/thread_siblings_list
3.0 1.0 1.0 1.0 0.0 2075 libvirtd /sys/devices/system/cpu/cpu3/topology/core_id
3.0 1.0 1.0 1.0 0.0 2075 libvirtd /sys/devices/system/cpu/cpu3/topology/thread_siblings_list
3.0 1.0 1.0 1.0 0.0 2075 libvirtd /sys/devices/system/cpu/online
3.0 1.0 1.0 1.0 0.0 2075 libvirtd /sys/devices/system/cpu/present
3.0 1.0 1.0 1.0 0.0 2075 libvirtd /sys/devices/system/node/node0/meminfo
2.0 0.0 0.0 0.0 2.0 12174 xchat /home/cking/.xchat2/xchatlogs/FreeNode-#ubuntu-release.log
1.0 0.0 0.0 0.0 1.0 12174 xchat /home/cking/.xchat2/xchatlogs/FreeNode-#ubuntu-desktop.log
1.0 0.0 0.0 0.0 1.0 12174 xchat /home/cking/.xchat2/xchatlogs/FreeNode-#ubuntu-devel.log
1.0 0.0 0.0 0.0 1.0 12174 xchat /home/cking/.xchat2/xchatlogs/FreeNode-#ubuntu-kernel.log
每 60 秒显示前 10 个活动文件,直到停止:
sudo fnotifystat -t 10 60
每 10 秒显示文件活动一次(仅 6 次):
sudo fnotifystat 10 6
显示 thunderbird 和进程 ID 1827 的文件活动:
sudo fnotifystat -p thunderbird,1827
显示 5 分钟内每个文件通知事件和前 20 个活动文件:
sudo sudo notifystat -v -d -c 5m 1
仅显示 /sys 和 /proc 上的每个文件通知事件,没有定期统计信息:
sudo fnotifystat -n -i /sys,/proc
有关更多信息,请参阅 fnotifystat 手册页,它是一个非常灵活的工具。
答案3
不幸的是,Linux 用来监视文件的机制是 inotify,它没有提供足够的信息来提取有用的数据:您只能获得文件名和已完成的操作。
我尝试过使用这样的东西:
sudo inotifywait -mr somedir --format "%w%f" | while read file; do echo -n "$file => ";lsof -b $file; echo ""; done
它会监听指定目录上的 inotify 事件,并针对每个事件运行 lsof 以尝试捕获接触该文件的进程。不幸的是,对于我测试的大多数访问(例如使用编辑器写入文件),LSOF 命令太慢,无法捕获有问题的进程。
如果您的进程对有问题的文件执行了更密集的 IO,那么您的里程可能会有所不同。祝你好运。