【问题标题】:Alternative to "lsof" command in LinuxLinux 中“lsof”命令的替代方案
【发布时间】:2018-05-03 08:32:33
【问题描述】:

我需要在 Linux(SUSE 和 RHEL)中使用命令来查找打开文件的列表,因为“lsof”命令需要时间来提供输出。即使“lsof -n”命令也需要很多时间。我们有任何替代“lsof”的命令吗?

谢谢, 僧团

【问题讨论】:

标签: linux shell redhat suse


【解决方案1】:

您可以从 proc 文件系统中读取打开的文件。

for p in /proc/{0..9}*; do
  i=$(basename "$p")
  for f in "$p"/fd/*; do
    l=$(readlink -e "$f")
    if [ "$l" ]; then
      echo "$i: $l"
    fi
  done
done | sort -u | sort -n

【讨论】:

    【解决方案2】:

    简而言之,使用lsof -n


    lsof 等待了很多,因为

    1. 扫描/dev中的所有设备会花费大量时间
    2. 它还使用大量时间从它找到的网络套接字的所有端点获取反向 dns 查询。其中许多没有有效的 revdns(如 0.0.0.0),并且查询它们会导致超时。
    3. 它是作为一个单线程的,不是面向事件的应用程序。

    您可以通过使用-n 禁用 dns 解析部分来显着加速。

    无论如何,扩展@ceving 的答案,您不仅可以查看打开的文件描述符列表,还可以查看映射到进程地址空间的文件列表 (cat /proc/<pid>/map)。


    通常,如果您的进程运行速度非常慢,则

    strace -f -tt -o sux <your command line>
    

    将转储到文件sux 内核调用进程所做的事情,并带有时间戳。从本质上讲,您将能够跟踪这个过程究竟做了什么以及持续了多长时间

    【讨论】:

    • 很棒的回答。让我尝试所有这些选项。再次感谢您的所有建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2011-07-20
    • 2014-12-10
    • 2017-09-17
    • 2022-08-23
    • 1970-01-01
    • 2018-09-09
    相关资源
    最近更新 更多