如何监视打开了哪些文件

如何监视打开了哪些文件

是否有一个工具可以监视哪些进程打开了系统上的哪些文件,以便您可以追踪哪个进程不断接触特定文件?

如果您在进程打开文件时运行了该进程,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,那么您的里程可能会有所不同。祝你好运。

相关内容