在unix中监控文件读/写的工具

在unix中监控文件读/写的工具

Unix 中是否有任何可用的工具/命令来监视特定文件的读/写。

我还想收集每次访问文件时读取的数据量。

答案1

简短的回答:据我所知,没有。

vmstat(运行vmstat 1以立即了解它的作用;^C退出)可以向您显示完整系统IO 使用(BI以及BO列、块入和块出可能是最直接有用的)。我发现它在大多数安静的系统上非常有用。

strace(运行strace -o /tmp/ls ls /tmp;然后查看/tmp/ls文件以查看它提供的数据)可以让您通过所有 write() 调用跟踪程序的执行路径,并为您感兴趣的文件描述符添加请求的大小。从好的方面来说,它可以编写脚本,并且专门针对该文件的程序。从坏的方面来说,它会减慢程序的执行速度(也许它会运行非常缓慢地),并且会完全错过所有使用mmap(2)内存区域的磁盘 IO。

您可以编写一个库,用LD_PRELOAD环境变量替换它read(2),并write(2)用包装器执行记账并最终调用系统调用(这几乎肯定不值得这么麻烦)。它也无法看到使用的磁盘 IO mmap(2)。您必须有非常好的理由才能走这条路。

你可以写一个保险丝后端进行记账。这会很慢,并且会减慢使用该文件系统的每个进程的速度。FUSE 代码还公开了许多内核内部结构,这些结构期望快速得到结果,但由于用户空间程序而导致任意长的(并且按照内核标准是极长的)延迟。程序可能会导致内存压力、交换和进一步的磁盘流量。FUSE 最适合部署在内存充足、非实时要求和故障成本低的环境中。

答案2

在 Linux 中,以前曾有多个用于监视文件系统活动的 API(dnotify 和 inotify),但最新的 API 称为fanotify。LWN 讨论 API这里

对于监视整个文件系统iostat,您请求的内容似乎有点像 iostat,但仅适用于给定文件。我不知道有这样的组合,但是通过使用 API,您可以编写自己的组合。

答案3

有家人, http://en.wikipedia.org/wiki/File_alteration_monitor,但不确定它是否适用于你的操作系统http://oss.sgi.com/projects/fam/

另外谷歌 inotify。

答案4

在 Linux 上你可以使用因克龙在 Solaris/BSD 上,您可能能够使用以下方法获取信息跟踪

相关内容