このスクリプトに示されているように、割り込みできない(つまり、kill -2
、notkill -9
)tcpdump
スクリプトは実行されますが、tcpdump
は終了せず、終了出力の一部を出力した後でもコマンドラインで実行を続けます。
(注:Sudo
およびtcpdump
により、このスクリプトにはkill
が必要です。
#!/bin/bash
#start a process in the background (it happens to be a TCP HTTP sniffer on the loopback interface, for my Apache server):
tcpdump -i lo -w dump.pcap 'port 80' &
#.....other commands that send packets to tcpdump.....
#now interrupt the process. get its PID:
pid=$(ps -e | pgrep tcpdump)
echo $pid
#interrupt it:
kill -2 $pid
私は答えの一部を見つけました このStack Overflowの投稿で 。
要約すると、tcpdump
は出力ファイルに書き込む前に出力をバッファリングしていたため、スクリプトがそれを中断しようとしたときに問題が発生しました。 -U
( "flush")オプションをtcpdump
に追加すると、これが修正されます。
また、sleep
を発行してすぐに初期化できるようにするtcpdump
コマンドが必要であり、ファイルへの書き込みを許可するために、それを強制終了する前にも必要でした。
#!/bin/bash
#start a process in the background (it happens to be a TCP HTTP sniffer on the loopback interface, for my Apache server):
tcpdump -U -i lo -w dump.pcap 'port 80' &
sleep 5
#.....other commands that send packets to tcpdump.....
#now interrupt the process. get its PID:
pid=$(ps -e | pgrep tcpdump)
echo $pid
#interrupt it:
sleep 5
kill -2 $pid
参照用に、man tcpdump
から、-U
オプションの下に:
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.
この後、スクリプトは正常に機能しました。