递归地使用 pid 打开所有文件以进行写入

递归地使用 pid 打开所有文件以进行写入

给定一个 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)?我不能简单地检查,因为对于大多数行,甚至不是列。teer$4 ~ "r"$4FD

答案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 

相关内容