Linuxでバッチのログを書き出し中のファイルを消して死ぬかと思ったが助かった話

諸事情で結構でかいデータの処理をすることになった。
かかる時間とかをログに出して計測しようと思って、標準出力をリダイレクトさせて放置してたんですわ。

んで、まあ、うっかり消しちゃった。
絶賛書き出し中の、そのファイルを。

一瞬死ぬかと思ったんだけど、ちょっと前になにかで、「プロセスがつかんでいるファイルはプロセスが生きてる間は実際には消えない」、って話を思い出したんです。
で、ググったら、あった。

削除したファイルをlsofで復元する
http://www.itmedia.co.jp/enterprise/articles/0611/30/news007.html

方法はすごい簡単で、

$ /usr/sbin/lsof | grep hoge

これでまずファイルの実体を探して cp でコピーすればすくい上げ完了。

$ cp /proc/プロセス番号/fd/ファイル番号 hoge.rescue

僕のケースでは、まだバッチがログを書き出し続けているので、これを tail -f で継続抽出することにした。
なので、こんな感じ。

$ cp /proc/プロセス番号/fd/ファイル番号 hoge.rescue && tail -f /proc/プロセス番号/fd/ファイル番号 >> hoge.rescue &

末尾に「&」をつけてバックグラウンド実行させて、ssh抜けても大丈夫なようにした。
あとはこのファイルをまた間違って消さないようにしないとな!

なんにせよ、助かった。
ありがとう!