pidを再帰的に使用して書き込むためにすべてのファイルを開く

pidを再帰的に使用して書き込むためにすべてのファイルを開く

pidが与えられたら、すべてのファイルを開いて次のように書くことができます。

lsof -p 28827 | awk '$4 ~ "[wW]"{print $(NF-1), $NF}'

そのうちの1つは最終的にパイプになります。

28827 232611 pipe

このパイプで開かれたすべてのファイルを見つけたいです。私がこうすれば:

lsof | grep 232611

これは私にいくつかのプロセスを提供し、そのうちの1つは次のとおりです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

単に数字の後に1つ以上の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 

関連情報