人間とウェブの未来

「ウェブの歴史は人類の歴史の繰り返し」という観点から色々勉強しています。

ファイルをrmしたがプロセスがファイルを掴んでいる場合にそのファイル内容を再度得るには

ど忘れしていたのでメモです。

LinuxでApacheのログローテート時に、プロセスをgracefulしたつもりが何らかの原因によりできていなくて、その後古いログファイルを圧縮して、いらなくなったその生ログファイルをrmしたつもりが、プロセスはそのログファイルのinodeを掴みっぱなしになっていて、古いログファイルにログを吐き続けていて困ったみたいな事があると思います。

その場合に、そのまま古いログファイルに吐き出さされているログをもう一度参照したいこともあります。差分がでてしまいますからね。

これinodeは掴みっぱなしだし、ディレクトリエントリからファイル名は消えているけど、fdもわかるから簡単にファイル内容取得できるはずだけどどうやるんだったかなーと思って試していたら、非常に簡単に取得できましたというメモです。

対象のプロセスからPIDを取得して、

ls -l /proc/PID/fd/

をして、rmしたつもりのファイルが(deleted)になっているのを確認し、そのfdの番号に対して、

cp /proc/PID/fd/${fdの番号} old_log_file

とかしてやると、rmしたつもりのファイルにrm後も継続して吐き出されているログを無事得る事ができました。

めでたしめでたし。