是否有一些实用程序,我可以在“内部”运行某个命令 A,列出 A 在执行时打开的所有文件?
我运行一个实用程序 (A) 来更改一些密码要求,但有些东西被破坏了。因此我需要手动打开更改的文件并查看内容。该命令在一秒钟左右完成,lsof
对于目的来说太慢了。
答案1
实现此目的的一种方法是跟踪程序进行的系统调用,并过滤open
/openat
系统调用或名称查找。
最初的两个工具分别truss
在 AT&T Unix System 5 和ktrace
4.4BSD 上。 (后者配对ktrace
,kdump
将机器可读的输出转换为人类可读的形式。)几十年后的一项后来的发明是 DTrace 框架。
现在,要跟踪某些命令的执行wibble
:
- 在 Illumos 和相关操作系统上,此实用程序是
truss
通过 SunOS 继承。例如truss -o truss.out -t 打开,打开摆动
- 在 OpenBSD 上,此实用程序是
ktrace
从 4.4BSD 开始,kdump
。例如ktrace -tn 摆动
- 在 MacOS 上,此实用程序是
dtruss
.例如dtruss -t 打开摆动
- 在基于 Linux 的操作系统上,此实用程序是
strace
。例如strace -o strace.out -e 打开,打开 wibble
- FreeBSD 及其衍生操作系统同时具备:
FreeBSD 和 Illumos 及其衍生产品也有dtrace
et al.作为 DTrace 框架的一部分,但这对于您在此的特定目的来说太过分了。 MacOSdtruss
实际上是基于 DTrace 框架构建的,这就是它需要超级用户权限的原因,这是这里提到的其他工具都没有的缺点。