给定一个 pid,我可以打开所有文件来编写如下内容:
lsof -p 28827 | awk '$4 ~ "[wW]"{print $(NF-1), $NF}'
其中之一最终成为管道:
28827 232611 pipe
我想查找该管道打开的所有文件。如果我只是这样做:
lsof | grep 232611
这给了我一堆流程,其中之一是tee
:
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
<app> 28827 <me> 1w FIFO 0,8 0t0 232611 pipe
<app> 28827 28836 <me> 1w FIFO 0,8 0t0 232611 pipe
<app> 28827 28901 <me> 1w FIFO 0,8 0t0 232611 pipe
....
tee 28828 <me> 0r FIFO 0,8 0t0 232611 pipe
我如何以编程方式找到(或一般情况下,任何可访问的进程PID
)?我不能简单地检查,因为对于大多数行,甚至不是列。tee
r
$4 ~ "r"
$4
FD
答案1
只需 grep 查找数字后跟一个或多个 s 就足够了r
:
lsof | grep -P '\b\d+r+\b'
或者,如果您没有 GNU grep:
lsof | grep -E '\b[0-9]+r+\b'
s\b
标记单词边界并确保仅匹配整个字段。或者,如果您的 grep 支持它,您可以使用该-w
标志:
lsof | grep -wE '[0-9]+r+'
因此,使用它,您可以获得相关的 PID
lsof | grep -wE '[0-9]+r+' a | awk '{print $2}'
@derobert 在下面的评论中指出,如果我花时间实际阅读 2562 行man lsof
,我会发现它提供了一个-F
选项,可以让您选择打印的字段。要获取文件的访问类型,请使用a
:
lsof -p 28827 -F a