情况
我在服务器上有一个目录/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(或文件系统类型的等效值)挂载,则可以使用 atime
find /home/foo -atime +10 -ls
查看其文件是否在 11 天内被访问过或者如果您喜欢“戳”一下,看看是否现在在这个目录下访问了一些东西:
lsof | grep /home/foo
应该给你一些线索(测试::cd /home/foo ; lsof | grep /home/foo
应该至少输出你的shell的pid,因为它现在在该路径下有它的cwd(当前工作目录)...)
(注:我现在无法测试两者,手头没有linux...但我认为两者都应该可以工作)