自定义 lsof 输出

自定义 lsof 输出

我需要一个进程打开的文件、端口等的列表。现在,每当我使用时,lsof -p <PID>我都可以在 python 脚本中解析输出,但问题是有时我会得到一些空列。因此,我在解析输出时得到了不好的结果。

我知道我可以在 /proc 中为每个进程手动查找 FD,但这必须符合 POSIX 标准。所以我的问题是,有没有办法lsof打印只是已打开文件的列表,没有其他内容?

我正在考虑类似用户特定ps命令(ps -eopid,user,comm,command),我们可以在其中指定输出中出现哪些命令。在本例中,我只想在lsof -p <PID>输出中指定“名称”列。

答案1

lsof有一个“可后处理”带有选项的输出格式-F(参见其他程序的输出手册中的部分)。

lsof -nPMp "$pid" -Fn | sed '
  \|^n/|!d
  s/ type=STREAM$//; t end
  s/ type=DGRAM$//; t end
  s/ type=SEQPACKET$//
  : end
  s|^n||'

将列出解析为文件系统上的路径的打开文件。

  • -nPM禁用一些lsof默认情况下进行的处理,但我们在这里不关心这些处理,例如解析 IP 地址、端口或 rpc 名称。
  • -p "$pid", 指定要列出其打开文件的进程
  • -Fn:通过现场输出。询问n我的一部分。
  • | sed后处理sed仅选择我们感兴趣的部分:
  • \|^n/|!d: 跳过任何不以以下内容开头的内容n/
  • s/ type=...$/;t end:删除行尾的那些字符串,end如果成功则跳转到标签。
  • : endend标签。
  • s|^n||:删除插入的前导n字符lsof以标识正在输出的字段。

但请注意,文件名中的不可打印字符以不明确的方式进行编码(例如\n换行符、^[ESC...)(如 in^[可能表示任一字符^[和 ESC)。

另外,对于已删除的文件,至少在 Linux 上,您仍然会获得文件路径,但会(deleted)附加文件路径。同样,无法区分已删除的文件和名称以(deleted).查看链接计数不一定有帮助,因为已删除的文件可能链接到其他地方。

type=*另请参阅我们对文件名中可能实际出现的 Unix 域套接字所做的删除。

这意味着虽然它在大多数情况下都可以工作,但在一般情况下您无法可靠地对输出进行后处理。

更不用说lsof本身可能无法正确解析内核返回的信息,或者内核可能无法以可靠的可解析格式提供该信息

相关内容