自定义 lsof 输出

Bet*_*ron 4 python lsof posix

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

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

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

Sté*_*las 5

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||'
Run Code Online (Sandbox Code Playgroud)

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

  • -nPM禁用一些默认情况下进行的处理lsof,但我们在这里不关心这些处理,例如解析 IP 地址、端口或 rpc 名称。
  • -p "$pid", 指定要列出其打开文件的进程
  • -Fn:通过现场输出。询问名称部分。
  • | 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它本身可能无法正确解析内核返回的信息,或者内核可能无法以可靠的可解析格式提供该信息