我编写了一个脚本来比较时间,如果开始时间与当前时间相同,而不是结束时间,则启动 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 就足够了。