時刻を比較し、開始時刻が終了時刻ではなく現在時刻と同じ場合、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で十分です。