プロセスごとに開いているファイル数を取得しようとしたときのlsofコマンドとの違い

プロセスごとに開いているファイル数を取得しようとしたときのlsofコマンドとの違い

各プロセスで開かれたファイルのリストを取得しようとしています。私は次の行を実行しましたパールモンクス:

lsof | perl -lane '$x{"$F[0]:$F[1]"}++;
END { print "$x{$_}\t$_" for sort {$x{$a}<=>$x{$b}} keys %x}'

プロセス名とPIDで開いているファイルの総数を返します。結果は昇順でソートされ、最後の行は次のようになります。

1065702 java:15437

したがって、これを実行するとlsof -p 15437同じ数値が返されると予想されますが、次のような結果が得られます。

$ lsof -p 15437 | wc -l
403

なぜ違いがありますか?

付録

3番目の違いの原因:

$ cd /proc/15437/fd
$ ls -1 | wc -l
216

ベストアンサー1

lsof引数を使用しないと、プロセスごとにすべてのスレッドに関する情報が提供されます。

代わりにlsof -p "$pid"、プロセスの開かれたファイルのみが一覧表示されます。

同じ番号を取得するには、次のものが必要です。

lsof -a -K -p "$pid"

また、lsofファイル記述子に開いているファイルだけでなく、マップされたファイル(図を参照)/proc/*/task/*/maps、現在の作業ディレクトリ(図を参照/proc/*/task/*/cwd)、ルートディレクトリ(図を参照/proc/*/task/*/root)も一覧表示されます。

おすすめ記事