![自定义 lsof 输出](https://linux22.com/image/91335/%E8%87%AA%E5%AE%9A%E4%B9%89%20lsof%20%E8%BE%93%E5%87%BA.png)
我需要一个进程打开的文件、端口等的列表。现在,每当我使用时,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
如果成功则跳转到标签。: end
:end
标签。s|^n||
:删除插入的前导n
字符lsof
以标识正在输出的字段。
但请注意,文件名中的不可打印字符以不明确的方式进行编码(例如\n
换行符、^[
ESC...)(如 in^[
可能表示任一字符^[
和 ESC)。
另外,对于已删除的文件,至少在 Linux 上,您仍然会获得文件路径,但会(deleted)
附加文件路径。同样,无法区分已删除的文件和名称以(deleted)
.查看链接计数不一定有帮助,因为已删除的文件可能链接到其他地方。
type=*
另请参阅我们对文件名中可能实际出现的 Unix 域套接字所做的删除。
这意味着虽然它在大多数情况下都可以工作,但在一般情况下您无法可靠地对输出进行后处理。