tcpdumpを実行する必要があるスクリプトで論理エラーが見つかりません。

tcpdumpを実行する必要があるスクリプトで論理エラーが見つかりません。

時刻を比較し、開始時刻が終了時刻ではなく現在時刻と同じ場合、tcpdumpを起動するスクリプトを作成しました。終了時刻が現在時刻と等しい場合は、PIDを検索して終了します。ところで、ここにはまだ論理的なエラーがあるようですが、どのように解決すべきかは本当に分かりません。

Code:
#!/bin/sh
source /media/usbhd-sd[b-d]1/config.conf
pluggedin=true
echo $TIMESTART
echo $TIMEEND
echo $$
echo $Zeit
echo $$ >> /tmp/test.txt
while [ $pluggedin ];do
        Zeit=$(date +"%T")
        if [[ $TIMESTART == $Zeit ]];then
                if [[ $TIMEEND != $Zeit ]] && [ "$(pidof tcpdump)" == "" ];then
                        echo "tcpdump started"
                        sudo tcpdump -i eth0 -w /media/usbhd-sd[b-c]1/abfrage2.pcap &
                        #sudo umount /dev/sdb1
                else
                        pid1=$(ps -eo pid,args|awk '/abfrage2/ && ! /awk/{print $1}')
                        echo $pid1 >> /tmp/test.txt
                        sudo kill $pid1
                        echo "autodump stopped"
                fi

        else
        echo "tcpdump not yet started"
        fi
done

デバッグしても最初のifが正しい場合はこの出力が表示されますが、最初のifが正しくない場合は内部ifもチェックされません。 PIDをチェックして外部ifでorを実行すると機能しますか?

Code:
+ [ true ]
+ date +%T
+ Zeit=08:51:00
+ [[ 08:51:00 == 08:51:00 ]]
+ [[ 08:51:02 != 08:51:00 ]]
+ pidof tcpdump
+ [ 9945 ==  ]
+ awk /abfrage2/ && ! /awk/{print $1}
+ ps -eo pid,args
+ pid1=
+ echo
+ sudo kill -9
kill: you need to specify whom to kill
+ echo autodump stopped
autodump stopped

修正する

私は直接いくつかのエラーを発見しました。

最新のコードです。これでほとんど動作しますが、tcpdumpはまだ終了しません。しかし、すでにファイルにデータを書き込んでいます。

    #!/bin/sh
source /media/usbhd-sd[b-d]1/config.conf
pluggedin=true
echo $TIMESTART
echo $TIMEEND
echo $$
echo $Zeit
echo $$ >> /tmp/test.txt
while [ $pluggedin ];do
        Zeit=$(date +"%T")
        if [[ $TIMESTART == $Zeit ]] || [[ "$pid1" != "" ]];then
                if [[ $TIMEEND != $Zeit ]];then
                        if [ "$pid1" == "" ];then
                                echo "tcpdump started"
                                sudo tcpdump -i eth0 -w /media/usbhd-sd[b-c]1/abfrage2.pcap &
                                pid1=$(ps -eo pid,args|awk '/abfrage2/ && ! /awk/{print $1}')
                                #sudo umount /dev/sdb1
                        else
                        echo "Tcpdump already running"
                        fi
                else
                        if [ "$pid" != ""];then
                                echo $pid1 >> /tmp/test.txt
                                sudo kill -9 $pid1
                                echo "autodump stopped"
                        else
                                echo "autodump already stopped"
                        fi
                fi

        else
        echo "tcpdump noch yet started"
        fi
done

これで、デバッグを通じてこの出力を取得します。時間が40秒の場合、PIDは使用できません。

+ [ true ]
+ date +%T
+ Zeit=10:45:39
+ [[ 10:45:30 == 10:45:39 ]]
+ [[ 30285 !=  ]]
+ [[ 10:45:40 != 10:45:39 ]]
+ [ 30285 ==  ]
+ echo Tcpdump already running
Tcpdump already running
+ [ true ]
+ date +%T
+ Zeit=10:45:40
+ [[ 10:45:30 == 10:45:40 ]]
+ [[ 30285 !=  ]]
+ [[ 10:45:40 != 10:45:40 ]]
+ [  != ]
sh: !=: argument expected
+ echo autodump already stopped
autodump already stopped

ベストアンサー1

良い質問、良い例、良いデータ、良い努力、ありがとう。

時間は常に変化するため、比較しやすい時間値を使用する必要があります。このdateコマンドを使用すると、すべての時間値を「エポック」(1970-01-01 00:00:00 UTC)以降の秒数に変更します。

timestart=$(date +%s -d "$TIMESTART")
timeend=$(date +%s -d "$TIMEEND")

で同じ形式を使用して、Zeit日付を整数で比較できるようになり、最も近い日付が大きくなります。

        Zeit=$(date +"%s")
        if [ $timestart -le $Zeit ];then
                if [ $timeend -le $Zeit ] && [ "$(pidof tcpdump)" == "" ];then

私もあなたが背景を殺そうとしているように見えることを知っていますtcpdump。たとえば、$!最後に開始されたバックグラウンドジョブのPIDを含む組み込み変数を使用することを検討できます(この回答のすべてのコードはテストされていません)。

unset tcpdump_pid
while [ $pluggedin ];do
        Zeit=$(date +"%s")
        if [ $timestart -le $Zeit ] && [ "$tcpdump_pid" == "" ]; then
                echo "tcpdump started"
                sudo tcpdump -i eth0 -w /media/usbhd-sd[b-c]1/abfrage2.pcap &
                tcpdump_pid=$$
        fi                            
        if [ $timeend -le $Zeit ] && [ "$tcpdump_pid" != "" ];then
                sudo kill $tcpdump_pid
        fi
        # sleep ?
done

tcpdumpマニュアルページによると、SIGINTまたはSIGTERMは終了するので、必要ではなくtcpdump使用-9しないでください。デフォルトkillのSIGTERMで十分です。

おすすめ記事