web-dev-qa-db-ja.com

プロセスによって現在書き込まれているファイルを見つける方法

私の状況では、特定のプロセス(この場合はThunderbird)が1分ほどユーザー入力に反応しないことがあります。 iotopを使用すると、この間、ディスクにかなりの量が書き込まれることがわかりました。次に、どのファイルに書き込むかを調べたいのですが、残念ながらiotopはプロセスごとの統計情報しか提供しません。開いているファイルごとではありません(-記述子)。

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

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

9
Philipp Wendler

ハングしたときにプロセスに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
6
Useless

私はあなたがルートアクセス権を持っています、私は最高のツールは 監査サブシステム だと思います。それについての文献はあまりありません(しかし、loggedfsについて以上のものです)。 このチュートリアル または afewexamples または auditctl manページ 。ここでは、デーモンが起動していることを確認してから、auditctlをrootとして実行するだけで十分です。

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

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