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

92

我想在OS X(10.9.1)上获取进程中打开文件的列表。在Linux中,我可以从/proc/PID/fd获取此信息。但是,我不确定如何在OS X上获取相同的信息。我发现默认情况下OS X上没有procfs(可能有实现方式,但我不想走这条路)。

那么,在OS X上如何本地获取进程中打开文件的列表?一种方法是使用lsof。是否有其他支持可用?请告诉我在哪里可以获取更多信息。

谢谢。


1
“lsof”是标题问题的预设答案。您是否考虑使标题更具体? - benc
9个回答

95

我曾经花了很大力气才让活动监视器(Activity Monitor)显示以root身份(通过sudo)运行的进程的打开文件。原问题提到了lsof,它能够完美地解决这个问题。如果你知道进程名称或PID,那就非常快速。

通过名称查找进程:

lsof -c processname

通过进程ID查找进程:

lsof -p 123

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


60

至少在OSX 10.10(Yosemite,未检查Mavericks),您可以通过默认的活动监视器应用程序按进程获取打开文件列表。只需双击列表中的相关进程,并选择弹出窗口上的“打开文件和端口”选项卡即可。

提示:在该面板上使用cmd+f快捷键可以搜索并突出显示内容。


4
它仅适用于您拥有的进程。对于所有其他进程,您仍需要使用“lsof”。 - Sija
在Big Sur中,Activity Monitor至少有一个菜单选项View -> "All processes"似乎可以工作。但是我的用户是Mac上的本地管理员。 - Friedrich 'Fred' Clausen

13

这对某些事情有效:

sudo fs_usage | grep dev

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


9

在编程中,检查当前进程(例如Linux上的/proc/self/fd等价物)的简单方法是使用ls /dev/fd/

例如:

$ touch "file"
$ exec 3<>file

$ ls /dev/fd/    

0 1 2 3

3
有没有一种方法可以访问除当前进程以外的其他进程? - Charles Duffy
@CharlesDuffy - 我不确定确切的内容;我重新措辞了我的回答。 - Travis Clarke
1
https://web.archive.org/web/20190724030849/http://osxbook.com/book/bonus/ancient/whatismacosx/arch_fs.html - mxmlnkn

6

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

lsof | grep "/Volumes/VolumeName"

1
或者:lsof "/Volumes/VolumeName" - Thomas Tempelmann
你可以使用 lsof -p pid 按 pid 进程过滤,也可以使用 -p ^pid 来反选该 pid 并获取除该进程外的所有打开文件。 - zevarito

4

通过默认的活动监视器应用程序,可以获得进程打开文件的列表。只需在列表中双击相关进程,并选择弹出窗口上的“打开的文件和端口”选项卡。

但是,“当进程以root(通过sudo)或其他用户运行时,您可能很难让Activity Monitor显示该进程的打开文件”。

所以,只需使用sudo运行Activity Monitor即可。

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

最好为此创建一个别名。 - A.D.

2

还有一些稍后发布的版本不在软件下载网站上:http://apps.tempel.org/WhatsOpen/。此外,v4的源代码可以在https://github.com/tempelmann/whatsopen找到。 - luckydonald

2
自从您问了“除了lsof之外还有其他支持吗?”,请尝试以下方法:
使用所选答案中引用的“proc_pidinfo”C API创建命令行工具,该问题如下:How can I programmatically get the list of open file descriptors for a given PID on OS X?

您可以使用PROC_PIDLISTFDS选项的proc_pidinfo列举由给定进程使用的文件。 然后,您可以依次对每个文件使用PROC_PIDFDVNODEPATHINFO选项的proc_pidfdinfo来获取其路径。


0

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^@

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接