タイミングtcpdump:パイプが遅い

タイミングtcpdump:パイプが遅い

私が実際にやりたいことは、10秒間tcpdumpを測定することです。

$ timeout 10s tcpdump > my.log

ところで、実際に録音される時間は10秒ではなく、非常に短い時間であることがわかりました。

それで私はこのような実験をしました。

#!/bin/bash
# a.sh
tcpdump & p1=$!

date                        
sleep 10s;                  
echo "Checkpoint #1"        
kill $p1;              
$ sudo ./a.sh # works as expected
$ sudo ./a.sh > my.log # not as expected
# it printed
25s
27s
27s

だから実際には2秒だけ録音されます。

Q1.やりたいことをどうすればいいですか?

Q2:ターミナル(またはpts?)で印刷するのがファイルとして印刷するよりも速いのはなぜですか? (だからそうだと思います。)

ベストアンサー1

標準出力がttyの場合、tcpdumpは「即時モード」をオンにします(pcap_set_immediate_mode(3)サポートされているシステムでは)。そして(tcpdumpは出力にstdio関数を使用するため)、出力はデフォルトでラインバッファリングされます。

ただし、tcpdumpの出力をファイルまたはパイプにリダイレクトするときは強制的に両方パケットをファイルに「ライブ」として書き込む場合は、明示的な即時モードとラインバッファリング。

tcpdump --immediate-mode -l > my.log

-nこのオプションを使用せずにtcpdumpDNSを介したアドレスリバースルックアップを試すこともできます。この場合、時間がかかることがあります。

tcpdump --immediate-mode -nl > my.log

対話的に使用しない場合は、ダンプ生のパケットを使用し、ダンプファイルの読み取りを使用している間に解析するのがtcpdump最善です。この場合、ダンプ出力を「ライブ」に設定するために使用する必要があります。-w-r-U-l

tcpdump --immediate-mode -Uw /path/to/dump
...
tail -c+0 -f /path/to/dump | tcpdump -r-

おすすめ記事