Bash 使用lsof跟踪通过命令行运行的脚本打开的文件

Bash 使用lsof跟踪通过命令行运行的脚本打开的文件,bash,process,lsof,Bash,Process,Lsof,我知道我可以使用lsof跟踪通过运行进程、进程组、用户打开的文件,以及在特定目录中打开的文件。然而,我很好奇,看看我是否能捕获由一个程序打开的文件,该程序并不总是在运行,但只运行有限的时间,比如bash脚本或Ruby程序 例如,假设我可以通过在Rails目录中执行rspec来运行Ruby测试。如何获取由rspec打开的所有文件的列表 换句话说,如何使lsof陷阱实时打开进程中的文件?从视觉上看,它看起来像lsof rspec,其中lsof执行rspec,并记录所有打开的文件 我想您可能正在寻找可

我知道我可以使用
lsof
跟踪通过运行进程、进程组、用户打开的文件,以及在特定目录中打开的文件。然而,我很好奇,看看我是否能捕获由一个程序打开的文件,该程序并不总是在运行,但只运行有限的时间,比如bash脚本或Ruby程序

例如,假设我可以通过在Rails目录中执行
rspec
来运行Ruby测试。如何获取由
rspec
打开的所有文件的列表


换句话说,如何使lsof陷阱实时打开进程中的文件?从视觉上看,它看起来像
lsof rspec
,其中
lsof
执行
rspec
,并记录所有打开的文件

我想您可能正在寻找可以跟踪和记录系统调用的
strace
程序。例如,我可以请求使用
grep
命令打开的文件列表,如下所示:

strace -e trace=open,openat grep something M* > /dev/null
-e trace=open,openat
选项告诉
strace
,我们只对这两个系统调用感兴趣

我已将
grep
的输出重定向到
/dev/null
,以避免输出混乱;您还可以使用
-o
选项将
strace
的输出发送到文件

假设我的本地目录中有文件
MANIFEST.in
MODULE\u 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
程序。例如,我可以请求使用
grep
命令打开的文件列表,如下所示:

strace -e trace=open,openat grep something M* > /dev/null
-e trace=open,openat
选项告诉
strace
,我们只对这两个系统调用感兴趣

我已将
grep
的输出重定向到
/dev/null
,以避免输出混乱;您还可以使用
-o
选项将
strace
的输出发送到文件

假设我的本地目录中有文件
MANIFEST.in
MODULE\u 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
本身打开的文件


您确实可以在。

中阅读更多内容。我正在使用MacOSX,所以我必须尝试一下DTrace。谢谢你的回答。我正在使用MacOSX,所以我必须尝试一下DTrace。谢谢你的回答。