我需要一个进程打开的文件、端口等的列表。现在,每当我使用时lsof -p <PID>
,我都可以在 python 脚本中解析输出,但问题是有时我会得到一些空列。因此,我在解析输出时得到了不好的结果。
我知道我可以在 /proc 中为每个进程手动查找 FD,但这必须符合 POSIX 标准。所以我的问题是,有没有办法只lsof
打印打开文件的列表,而不打印其他内容?
我正在考虑类似用户特定ps
命令(ps -eopid,user,comm,command
),我们可以在其中指定输出中出现哪些命令。在本例中,我只想在输出中指定“名称”列lsof -p <PID>
。
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
如果成功则跳转到标签。: end
:end
标签。s|^n||
:删除插入的前导n
字符lsof
以标识正在输出的字段。但请注意,文件名中的不可打印字符以不明确的方式进行编码(例如\n
换行符、 ESC...)(如 in可能表示任一和 ESC)。^[
^[
^[
另外,对于已删除的文件,至少在 Linux 上,您仍然会获得文件路径,但会附加文件路径(deleted)
。同样,无法区分已删除的文件和名称以(deleted)
. 查看链接计数不一定有帮助,因为已删除的文件可能链接到其他地方。
type=*
另请参阅我们对文件名中可能实际出现的 Unix 域套接字所做的删除。
这意味着虽然它在大多数情况下都可以工作,但在一般情况下您无法可靠地对输出进行后处理。
更不用说lsof
它本身可能无法正确解析内核返回的信息,或者内核可能无法以可靠的可解析格式提供该信息
归档时间: |
|
查看次数: |
3200 次 |
最近记录: |