【问题标题】:Get list of open files (descriptors) in OS X获取 OS X 中打开的文件(描述符)列表
【发布时间】:2014-01-07 14:40:29
【问题描述】:

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

那么我如何(本机)获取 OS X 进程中打开文件的列表。一种方法是 lsof。还有其他支持吗?请告诉我在哪里可以获得更多信息。

谢谢。

【问题讨论】:

  • lsof 是对标题本身问题的假定答案。你会考虑让标题更具体吗?

标签: macos osx-mavericks file-descriptor procfs


【解决方案1】:

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

按名称查找进程:

lsof -c processname

按 PID 查找进程:

lsof -p 123

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 它仅适用于您拥有的进程。对于所有其他人,您仍然需要使用lsof
    • 至少在 Big Sur 中,Activity Monitor 有一个菜单选项 View -> "All processes" 似乎可以工作。我的用户是 Mac 上的本地管理员。
    【解决方案3】:

    这适用于某些事情:

    sudo fs_usage | grep dev
    

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

    【讨论】:

      【解决方案4】:

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

      例如

      $ touch "file"
      $ exec 3<>file
      
      $ ls /dev/fd/    
      
      0 1 2 3
      

      【讨论】:

      【解决方案5】:

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

      lsof | grep "/Volumes/VolumeName"
      

      【讨论】:

      • 或者更确切地说:lsof "/Volumes/VolumeName"
      • 您可以使用lsof -p pid 按pid 进行过滤,也可以通过-p ^pid 否定该pid 并获取除由pid 打开的所有内容。
      【解决方案6】:

      既然你问“还有其他支持 [除了 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_pidfdinfo 和 PROC_PIDFDVNODEPATHINFO 选项来获取其路径。

      【讨论】:

        【解决方案7】:

        我使用非常实用的 What's Open 应用程序(带有过滤器、磁盘选择......)。

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

        【讨论】:

          【解决方案8】:

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

          所以只需通过 sudo 运行 Active Monitor,就可以了

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              猜你喜欢
              • 2013-03-13
              • 1970-01-01
              • 2011-08-04
              • 1970-01-01
              • 2011-01-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-05-02
              相关资源
              最近更新 更多