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

时间:2018-06-23 18:04:32

标签: bash process lsof

我知道我可以使用lsof来跟踪正在运行的进程,进程组,用户以及在特定目录中打开的文件所打开的文件。但是,我很好奇我是否可以捕获由并非始终运行但仅在有限的时间内运行的程序(例如bash脚本或Ruby程序)打开的文件。

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

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

1 个答案:

答案 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.inMODULE_GUIDELINES.mdMakefile,这可能会产生如下输出:

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中阅读更多内容。