我如何告诉 lsof 我只需要列出物理文件(不是套接字,不是 TCP/IP 连接,只有物理文件)?
答案1
刚刚浏览了一些手册页,看来您使用了以下命令:
sudo lsof /
这将列出 / 目录中所有打开的文件,也就是 Linux 文件系统上的所有内容。刚刚测试过,它只显示 REG 和 DIR。
更多示例:
lsof -a -d 0-999 -c <command name> /
lsof -a -d 0-999 -p <pid> /
0-999 将其限制为具有文件描述符编号的文件。
答案2
可能有一个开关,但如果您不介意通过 grep 进行过滤,您可以这样做sudo lsof | egrep 'REG|DIR'
,假设“物理文件”是指常规文件和目录。
请参阅手册页的 OUTPUT :: TYPE 部分,man lsof
了解该列可能存在的所有类型。
答案3
这是我所做的并且对我来说非常有效:
lsof -F n -p 12501 | grep ^n/ | cut -c2- | sort -u
选项-F n
将lsof
导致它只打印出名称打开的文件。每个包含打开文件名称的输出行都将以单个字符开头n紧接着姓名。常规的files 始终是文件的绝对、完全限定名称。 将grep ^n/
仅选择名称以 开头的行/
(表示绝对、完全限定的文件名);从而消除诸如开放端口、套接字、管道(如 FIFO)等。 将cut -c2-
消除第一个字符,n
,仅留下文件名。 最后,sort -u
将消除任何重复条目。
需要注意的是,这将包括不常规的只要其名称以 开头/
。例如,所有以以下内容开头的文件都将包含在内:
- /dev
- /进程
- /系统
可能还有其他内容,具体取决于您的操作系统。
答案4
如果您使用lsof /
它,它将仅列出直接安装在 / 下的文件系统上的打开文件 - 也就是说,如果您将 /home 安装在 / 下,则其内容将被忽略。我尝试了 lsof 的各种选项组合,但都存在问题。我能想到的最好的方法是:
lsof `readlink -f /dev/block/*`
这使用 readlink -f 来获取所有块设备并将它们作为列表提供到搜索。lsof 会忽略未安装的块设备。
如果您有任何其他选项来限制搜索,例如 pid,请记住以-a
AND 结尾 lsof 命令,并将它们与块设备列表进行连接:
lsof -p 982482 -a `readlink -f /dev/block/*`