私が実際にやりたいことは、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
このオプションを使用せずにtcpdump
DNSを介したアドレスリバースルックアップを試すこともできます。この場合、時間がかかることがあります。
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-