获取 OS X 中打开文件(描述符)的列表

我想得到一个进程中打开的文件列表在 OS x (10.9.1)。在 Linux 中,我可以从 /proc/PID/fd中得到这个。但是我不确定如何在 OS X 上获得同样的效果。我发现在 OS X 上没有 procfs (默认情况下)。可能存在的实现,但我不想走那条路)。

因此,我如何在 OS X 上获得打开的文件列表。一种方法是 lsof。还有其他支援吗?请告诉我在哪里可以得到更多的信息。

谢谢。

82756 次浏览

我使用 What’s Open 应用程序,它非常简单(带有过滤器、磁盘选择,...)。

你可以在那里找到它: http://whatsopen.en.softonic.com/mac

至少在 OSX 10.10(Yosemite,没有检查 Mavericks)上,您可以通过默认的活动监视器应用程序按进程获得打开的文件列表。只需双击列表中的相关进程,然后在弹出窗口中选择“ Open Files and Ports”选项卡。

提示: 该窗格上的 cmd + f 快捷方式允许搜索和突出显示内容。

这对某些事情有效:

sudo fs_usage | grep dev

用于 /dev/文件或类似文件。

我很难让活动监视器显示以 root 身份运行的进程的打开文件(通过 sudo)。最初的问题提到了 lsof,它确实起到了作用。如果您知道进程名或 PID,那么它会非常快。

按名称查找进程:

lsof -c processname

通过 PID 查找进程:

lsof -p 123

(根据需要使用 sudo作为前缀,例如您不是进程的所有者。)

检查当前进程(也就是说。相当于 Linux 上的 /proc/self/fd)的简洁方法是使用 ls /dev/fd/:

例如:。

$ touch "file"
$ exec 3<>file


$ ls /dev/fd/


0 1 2 3

既然您问到“除了 lsof 之外还有其他支持吗?”,那么试试下面的方法:

使用“ proc _ pidinfo”C API 创建一个命令行工具,该 API 参考了这个问题的选定答案: 在 OS X 上,如何以编程方式获得给定 PID 的打开文件描述符列表?

可以使用 PROC _ pidinfo 和 PROC _ PIDLISTFDS 选项枚举给定进程使用的文件。然后,可以使用 PROC _ PIDFDVNODEPATHINFO 选项依次对每个文件使用 PROC _ pidfdinfo 来获取其路径。

列出/Volume/VolumeName 上打开的文件:

lsof | grep "/Volumes/VolumeName"

”您可以通过默认的活动监视器应用程序按进程获得打开的文件列表。只需双击列表中的相关进程,然后在弹出窗口中选择“ Open Files and Ports”选项卡 但是“很难让活动监视器显示以 root 用户(通过 sudo)或其他用户运行的进程的打开文件”。

所以只要在 sudo 上运行 Active Monitor,就可以了

sudo /Applications/Utilities/Activity\ Monitor.app/Contents/MacOS/Activity\ Monitor

lsof -c /^74016$/ -d^txt -FcfadDtns0

-F指示 lsof生成适合其他进程(如 Perl 或 awk)使用的输出。在 man lsof中搜索 OUTPUT FOR OTHER PROGRAMS以获得详细信息。-F之后的字符表示要选择用于输出的字段。然后输出将这些字符放在各自字段的前面。输出示例:

p212^@cloginwindow^@
fcwd^@a ^@tDIR^@D0x1000004^@s704^@n/^@
f0^@ar^@tCHR^@D0xf218cacb^@n/dev/null^@
f1^@au^@tCHR^@D0xf218cacb^@n/dev/null^@
f2^@au^@tCHR^@D0xf218cacb^@n/dev/null^@
f3^@ar^@tREG^@D0x1000004^@s216424^@n/Library/Application Support/CrashReporter/SubmitDiagInfo.domains^@
f4^@ar^@tREG^@D0x1000004^@s77^@n/private/etc/security/audit_user^@
f5^@ar^@tREG^@D0x1000004^@s652^@n/private/etc/security/audit_class^@
f6^@ar^@tREG^@D0x1000004^@s358^@n/private/etc/security/audit_control^@
f7^@ar^@tREG^@D0x1000004^@s111033^@n/System/Library/Frameworks/CoreImage.framework/Versions/A/Resources/ci_stdlib.metallib^@
f8^@au^@tIPv4^@d0xc401abd77f1dd1d9^@n*:*^@
f9^@ar^@tREG^@D0x1000004^@s308316^@n/System/Library/Frameworks/CoreImage.framework/Versions/A/Resources/ci_filters.metallib^@
f10^@au^@tREG^@D0x1000004^@s1536^@n/private/var/folders/4g/3lkhwv6n7_76_1s8snscvhxc0000gp/C/com.apple.loginwindow/com.apple.metal/3902/libraries.maps^@
f11^@au^@tREG^@D0x1000004^@s65536^@n/private/var/folders/4g/3lkhwv6n7_76_1s8snscvhxc0000gp/C/com.apple.loginwindow/com.apple.metal/3902/libraries.data^@
f12^@au^@tREG^@D0x1000004^@s1536^@n/private/var/folders/4g/3lkhwv6n7_76_1s8snscvhxc0000gp/C/com.apple.loginwindow/com.apple.metal/Intel(R) HD Graphics 630/functions.maps^@
f13^@au^@tREG^@D0x1000004^@s131072^@n/private/var/folders/4g/3lkhwv6n7_76_1s8snscvhxc0000gp/C/com.apple.loginwindow/com.apple.metal/Intel(R) HD Graphics 630/functions.data^@
p421^@ccoreauthd^@
fcwd^@a ^@tDIR^@D0x1000004^@s704^@n/^@
f0^@ar^@tCHR^@D0xf218cacb^@n/dev/null^@
f1^@au^@tCHR^@D0xf218cacb^@n/dev/null^@
f2^@au^@tCHR^@D0xf218cacb^@n/dev/null^@
p537^@cUserEventAgent^@
fcwd^@a ^@tDIR^@D0x1000004^@s704^@n/^@
f0^@ar^@tCHR^@D0xf218cacb^@n/dev/null^@
f1^@au^@tCHR^@D0xf218cacb^@n/dev/null^@
f2^@au^@tCHR^@D0xf218cacb^@n/dev/null^@
f3^@au^@tunix^@d0xc401abd77b9c8579^@n->0xc401abd77b9c8709^@
f4^@au^@tunix^@d0xc401abd77b9c7129^@n->0xc401abd77b9c8899^@