各プロセスで開かれたファイルのリストを取得しようとしています。私は次の行を実行しましたパールモンクス:
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
)も一覧表示されます。