列出命令打开的文件? lsof 太慢了

列出命令打开的文件? lsof 太慢了

是否有一些实用程序,我可以在“内部”运行某个命令 A,列出 A 在执行时打开的所有文件?

我运行一个实用程序 (A) 来更改一些密码要求,但有些东西被破坏了。因此我需要手动打开更改的文件并查看内容。该命令在一秒钟左右完成,lsof对于目的来说太慢了。

答案1

实现此目的的一种方法是跟踪程序进行的系统调用,并过滤open/openat系统调用或名称查找。

最初的两个工具分别truss在 AT&T Unix System 5 和ktrace4.4BSD 上。 (后者配对ktracekdump将机器可读的输出转换为人类可读的形式。)几十年后的一项后来的发明是 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 及其衍生操作系统同时具备:
    • AT&T 的克隆truss,但是缺少-t原始选项,这意味着您必须使用常用的文本处理工具对内容进行后处理;和
    • ktrace(加kdump)从 4.4BSD 开始,它支持-t n.

FreeBSD 和 Illumos 及其衍生产品也有dtraceet al.作为 DTrace 框架的一部分,但这对于您在此的特定目的来说太过分了。 MacOSdtruss实际上是基于 DTrace 框架构建的,这就是它需要超级用户权限的原因,这是这里提到的其他工具都没有的缺点。

相关内容