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


9

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

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

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


ネットワーク接続で発生する発信接続のログ記録も参照してください
Gilles 'SO- stop be evil'

回答:


6

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

おかげで、プロセスの実行中にstraceをアタッチできることを知りませんでした。これやってみます
Philipp Wendler、2012

1
lsof -p $PIDファイル記述子がどこを指しているかを知るために、この情報をと交差させることができます
Coren

1
またはls -l /proc/pid/fdLinuxの場合
役に立たない

straceを使用すると、実際に知りたいことが正確にわかるので、もう一度感謝します。
Philipp Wendler、2012

2

rootアクセス権があれば、監査サブシステムが最適なツールになると思います。それについての文献はあまりありません(しかし、loggedfsについてはそれ以上です)。あなたが開始することができ、このチュートリアルいくつかのまたはちょうどでmanページ。ここでは、デーモンが起動していることを確認して、ルートとして実行するだけで十分です。 auditctlauditctl

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

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


straceの興味深い代替手段として監査サブシステムを指摘していただきありがとうございます。ただし、ファイルが開かれたときにのみログに記録されるため、ここでは役に立たないようです。したがって、各ファイルにどれだけ書き込まれているかを確認できません。
Philipp Wendler、2012

@PhilippWendlerああ。うーん。追加-S read -S write(未テスト)してみてください。
Gilles 'SO-悪をやめる'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.