情况

情况

情况

我在服务器上有一个目录/home/foo,我想它不再需要了。

不幸的是没有人能告诉我这个目录是否仍然需要。

目标

如果仍然需要这个目录,我想知道哪个进程访问它。

目前的策略

观察此目录下打开的所有文件。

为什么不使用inotify

不幸的是该目录包含很多子目录,这就是为什么我不想使用inotify。

  • 1604508 个文件
  • 287253个子目录

问题

如何查看目录(递归)树下打开的所有文件?我想知道哪个进程访问它。

环境

  • /home是一个 ext4 文件系统。
  • 苏塞Linux 12.3。内核:3.7.10

不重复

我的问题不是重复的是否可以找出哪个程序或脚本创建了给定文件?自从 ....:

  • 我无法使用 inotify,因为目录树包含太多子目录。
  • 我无法使用loggingfs:我无法更改此目录的文件系统类型。

赏金

已经有两个很好的答案了。但我很好奇,也许还有其他方法:赏金 50 :-)

答案1

您应该能够使用auditd(尽管这取决于您的 Linux 发行版是否可用)。

auditctl命令用于配置审核,手册页应描述如何实现您的需要。

就像是,

auditctl -w /home/foo -p war -k foo-watch

然后您可以稍后使用以下命令搜索审核日志:

ausearch -k foo-watch

在 SUSE 上执行此操作的示例可以是在这里找到

答案2

我不知道它是否在 SuSE 中启用,但是扇通知api 监视整个文件系统。甚至还有一个简单的实用程序法特拉斯这将显示每个文件被打开、读取、写入、关闭。例子

$ cd; sudo fatrace -f O -c 
tail(1500): CO /home/meuh/dot/privoxy/logs/160426
ls(28599): O /home/meuh
bash(2075): O /home/meuh/dot/bashhistory.xt-right

-f O只是跟踪打开情况,以及跟踪-c保存当前工作目录的整个文件系统。您也可以选择获取时间戳。

答案3

我可以看到几种方法:

  • 如果包含 /home/foo 的文件系统使用 atime(或文件系统类型的等效值)挂载,则可以使用 atimefind /home/foo -atime +10 -ls查看其文件是否在 11 天内被访问过

  • 或者如果您喜欢“戳”一下,看看是否现在在这个目录下访问了一些东西:lsof | grep /home/foo应该给你一些线索(测试:: cd /home/foo ; lsof | grep /home/foo应该至少输出你的shell的pid,因为它现在在该路径下有它的cwd(当前工作目录)...)

(注:我现在无法测试两者,手头没有linux...但我认为两者都应该可以工作)

相关内容