2011/11/26

入力を任意の間隔で任意の世代だけ書き出す App::Rolling

App::Rolling

知ってる linux のコマンドは片手で足りる bayashi ですこんばんは。

ほんとうに、CUI 苦手なんです。 for の使い方をマスターしたのも最近なんです。なのに、なぜか僕が TCP ダンプ取るとか言う場面がきたんです。あれ、ファイルに書き出すとどんどんたまっていっちゃって、なんかディスク容量に空きがあってもとっても不安にかられたりするわけです。しかも、目的の通信はなかなか来ないのです。待ち構えてるだけで時間の無駄なわけです。え、その通信再現できないの?アホなの? いや、わかりますけど、まあ、本番だけで、たまーにしか起こらない謎の通信って、あったりするじゃないですか。

そんなわけで、TCPダンプの結果を落とすときに、ファイルをよしなに rotate してくれるやつがあればひとつ世の中 便利になるんじゃないかなと思って書きました。

App::Rolling に付属する roll コマンドを使ってみてください!

$ /usr/sbin/tcpdump | roll -f /tmp/dump

上のような感じで dump を流し込むと、

$ ls /tmp | grep dump
dump.12345    dump.12346    dump.12347
dump.12348    dump.12348

という風に出力を分割して書き出して、勝手に世代管理してくれます。
なので、容量をある程度に抑えながら、目的の通信がきたらよっこらしょと止めて確認することが可能です。

オプションは以下のようになっております。

-f --file        write file path *require*
-a --age         number of rotate age [default:5]
-i --interval    file rolling interval(sec) [default:60]
-t --through     write down and through STDIN
-nr --no-rotate  never rotate output

例えば以下のように書くと、10世代でローテーションして、1世代が180秒間の出力を確保します。あとついでに、dump出力を STDIN に垂れ流して、リアルタイムで観察したりもできます(デフォルトは出さない)。

$ /usr/sbin/tcpdump | roll -f /tmp/dump -a 10 -i 180 -t

個人的には意図した動作はしてると思いますが、まだ自分も本番サーバでは試してないので、そういうクオリティであることを理解したうえでお試しください。

いやしかし、書いてみてから気づいたのだけど、絶対同じことを簡単にやるワンライナーある気がする、、
あと、@xaicron さんにみてもらったら、サフィックスがいけてないからよくあるローテートツール互換にしたらいいと思うけどよくわからないと言われているので、僕もよくわかりませんがもうちょっとその辺頑張ろうかなと思ってます。

サイト内検索