如何收集 Linux 应用程序打开的所有文件

如何收集 Linux 应用程序打开的所有文件

我想要收集由应用程序打开的所有文件的列表(在我的情况下是 as/w bulder)。

'strace -f' 失败,因为它混合了来自不同分支的连续打开,例如:

13078 open("file1", O_RDONLY <unfinished ...>
13077 open("file2", O_RDONLY|O_LARGEFILE) = 3
13078 <... open resumed> )              = 3

我无法跟踪“file1”是否实际打开或因 E_NOENT 而失败。

'strace -ff' 也失败了,因为它创建了太多文件(应用程序生成了大量子进程),并且创建了 program.${pid}、program.${pid+1} 等等,大约 32k 个 fork 之后,它再次创建并重写 program.${pid}、program.${pid+1}。我可以用 Google 搜索如何增加进程编号,但无论如何我不想要这么多文件。

所以问题是,我可以使用 strace 或其他工具快速而简单地解决这个问题吗?

答案1

strace -f -eopen /path/to/cmd args ... 2>&1 | gzip > output.log.gz


如果你正在寻找一个特定的过程,而不是全部那么孩子们:

gunzip output.log.gz | head -n500 | less

读取文件直到找到您正在寻找的特定程序的进程 ID (pid),然后使用grep


如果你正在寻找特定的结果(例如没有 ENOENT),你可以通过 grep 将其找出来:

zgrep --invert-match ENOENT output.log.gz | less

相关内容