物理ファイルのみ(ソケットや TCP/IP 接続ではなく、物理ファイルのみ)をリストする必要があることを lsof に伝えるにはどうすればよいですか?
答え1
いくつかのマニュアルページを調べたところ、次のコマンドを使用しているようです:
sudo lsof /
これにより、/ ディレクトリ内の開いているファイルがすべて一覧表示されます。これは、Linux ファイルシステム上のすべてのファイルです。テストしたところ、REG と DIR のみが表示されます。
その他の例:
lsof -a -d 0-999 -c <command name> /
lsof -a -d 0-999 -p <pid> /
0 ~ 999 は、ファイル記述子番号を持つファイルに制限します。
答え2
スイッチがあるかもしれませんが、grep でフィルタリングしても構わない場合は、 を実行できます。ここsudo lsof | egrep 'REG|DIR'
で、「物理ファイル」とは、通常のファイルとディレクトリを意味するものとします。
man lsof
その列に含まれる可能性のあるすべてのタイプについては、マニュアル ページの OUTPUT :: TYPE セクションを参照してください。
答え3
これは私にとって完璧に機能した方法です:
lsof -F n -p 12501 | grep ^n/ | cut -c2- | sort -u
オプション-F n
をlsof
選択すると、名前開いているファイルの名前を持つ各出力行は、1文字で始まります。んすぐに名前。通常files は常にファイルの絶対完全修飾名になります。 は、 (絶対完全修飾ファイル名を意味する)grep ^n/
で始まる名前を持つ行のみを選択します/
。これにより、開いているポート、ソケット、パイプ (FIFO など) などが除外されます。 はcut -c2-
最初の文字である を除外しn
、ファイル名のみを残します。最後に、 はsort -u
重複するエントリを除外します。
ただし、これには通常名前が で始まる限り、対象と/
なります。たとえば、次で始まるすべてのファイルが含まれます。
- /開発
- /proc
- /システム
また、OS によっては他のものが存在する場合もあります。
答え4
これを使用すると、lsof /
/ の下に直接マウントされたファイルシステム上の開いているファイルのみがリストされます。つまり、/ の下に /home がマウントされている場合、その内容は無視されます。lsof のオプションのさまざまな組み合わせを試しましたが、すべてに問題がありました。私が思いついた最良の方法は次のとおりです。
lsof `readlink -f /dev/block/*`
これは、readlink -f を使用してすべてのブロック デバイスを取得し、それらを検索リストとして入力します。lsof はマウントされていないデバイスを無視します。
検索を制限する他のオプション(たとえば、pid)がある場合は、lsof コマンドの最後に、-a
ブロック デバイスのリストと AND 演算することを忘れないでください。
lsof -p 982482 -a `readlink -f /dev/block/*`