その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

tcpdumpで今すぐキャプチャ内容を全部ファイルにflushしてくれ!! というとき

tcpdumpはキャプチャした内容をバッファに蓄積してバッチ的にflushするので,うっかりプロセスを即断するとキャプチャしていた内容をdrainできないことがままあります.困りますね.

www.tcpdump.org

Using the SIGUSR2 signal along with the -w flag will forcibly flush the packet buffer into the output file.

というわけでここに書いてあるとおり,SIGUSR2tcpdumpのプロセスに対して発行してあげるとその時点のバッファの内容をファイルに吐き出します (ただし -w フラグによって出力先ファイルを指定している,すなわちファイル書き出しモードにしている必要がある).

If the -w option is specified, make the saved raw packet output ``packet-buffered''; i.e., as each packet is saved, it will be written to the output file, rather than being written only when the output buffer fills.

あるいは -U (--packet-buffered) フラグを -w フラグとともに利用するというのも良いでしょう.ただ,この際はバッファをバイパスして直接ファイルに書き込むような挙動となるので,tcpdumpdaemonとして常に動かしているような環境ではパフォーマンスの問題が発生する可能性があるので注意が必要そうです.


なお,-B オプションを使ってバッファサイズを0にするとどうなのか……というとこれは

tcpdump: invalid packet buffer size 0

と出て動きません.なるほど〜,そりゃそうですね.