プロセスが現在どのファイルに書き込んでいるかを確認する方法

プロセスが現在どのファイルに書き込んでいるかを確認する方法

私の状況は、特定のプロセス(この場合はThunderbird)がユーザー入力に約1分間反応しないことがあります。私はiotopそれを使用しながらディスクに多くを記録することがわかりました。これで、どのファイルに書き込むかを知りたいのですが、残念ながら、iotop開かれたファイル(説明者)固有の統計ではなく、プロセス固有の統計のみを提供します。

私はこれを使用して、lsofプロセスによって現在開いているファイルが何であるかを知ることができることを知っていますが、もちろんThunderbirdは多くのファイルを開くので、あまり役に立ちません。iostatデバイス固有の統計のみを表示します。

この問題はランダムに発生し、表示されるのにかなり長い時間がかかる可能性があるため、どのファイルに最も多くの書き込みがあるかを調べるためにThunderbirdを追跡し、長いログを記録する必要がないことを願っています。

答え1

プロセスが中断されている間にプロセスにstraceを接続すると(代替端末から事前にpidを取得してコマンドをキューに入れることができます)、書き込みをブロックするファイル記述子が表示されます。

簡単な例:

$ mkfifo tmp
$ cat /dev/urandom > tmp &
[1] 636226
  # this will block on open until someone opens for reading

$ exec 4<tmp
  # now it should be blocked trying to write

$ strace -p 636226
Process 636226 attached - interrupt to quit
write(1, "L!\f\335\330\27\374\360\212\244c\326\0\356j\374`\310C\30Z\362W\307\365Rv\244?o\225N"..., 4096 <unfinished ...>
^C
Process 636226 detached

答え2

ルートアクセス権がある場合、最良のツールは次のとおりです。監査サブシステム。これに関する文献はあまりありません(ただし、Loggedfsに関するもの以上)。このチュートリアルまたは 珍しい はいそれともauditctlマニュアルページ。ここでは、デーモンが起動していることを確認してからrootauditctlとして実行するだけで十分です。

auditctl -a exit,always -F pid=1234 -F dir=/home/philipp

/var/log/audit/audit.logこれは、pid 1234のプロセスがどこかに書き込まれるたびにログに記録されます/home/philipp。に比べてオーバーヘッドがかなり小さいですstrace

関連情報