我知道我可以使用lsof
来跟踪正在运行的进程,进程组,用户以及在特定目录中打开的文件所打开的文件。但是,我很好奇我是否可以捕获由并非始终运行但仅在有限的时间内运行的程序(例如bash脚本或Ruby程序)打开的文件。
例如,假设我可以通过在Rails目录中执行rspec
来运行Ruby测试。如何获得rspec
打开的所有文件的列表?
换句话说,如何使lsof实时捕获进程中打开的文件?从外观上看,它看起来像lsof rspec
,其中lsof
执行rspec
并记录所有打开的文件。
答案 0 :(得分:2)
我认为您可能正在寻找可以跟踪和记录系统调用的strace
程序。例如,我可以要求通过grep
命令打开的文件列表,如下所示:
strace -e trace=open,openat grep something M* > /dev/null
-e trace=open,openat
选项告诉strace
,我们只对这两个系统调用感兴趣。
为了避免使输出混乱,我将grep
的输出重定向到/dev/null
。您还可以使用strace
选项将-o
的输出发送到文件。
假设我的本地目录中有文件MANIFEST.in
,MODULE_GUIDELINES.md
和Makefile
,这可能会产生如下输出:
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libpcre.so.1", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib64/gconv/gconv-modules.cache", O_RDONLY) = 3
openat(AT_FDCWD, "Makefile", O_RDONLY|O_NOCTTY) = 3
openat(AT_FDCWD, "MANIFEST.in", O_RDONLY|O_NOCTTY) = 3
openat(AT_FDCWD, "MODULE_GUIDELINES.md", O_RDONLY|O_NOCTTY) = 3
+++ exited with 0 +++
您可以在此处看到运行grep
时打开的共享库以及grep
本身打开的文件。
您可以在strace man page中阅读更多内容。