在应该执行 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 就足够了。

相关内容