私のスクリプトでtcpdumpを起動し、しばらくしてからもう一度終了したいと思います。 tcpdumpからPIDにアクセスするには? $$を試してみましたが、スクリプトは終了しました。
if [[ $TIMEEND != $Zeit ]];then
echo "tcpdump started"
sudo tcpdump -i eth0 -w /media/usbhd-sd[b-c]1/abfrage2.pcap &
pid1=$!
break
#sudo umount /dev/sdb1
else
sudo kill $pid1
echo "autodump stopped"
fi
これはtcpdumpをgrepしたときの出力なので、pidofとpkillを使うことは不可能だと思います。
私はそれをするためにawkを使ってみました。
pid1=$(ps -eo pid,args|awk '/abfrage2/ && ! /awk/{print $1}')
echo $pid1 >> /tmp/test.txt
sudo kill $pid1
pidコマンドを直接使用するとpidが見つかりましたが、killを実行しません。
私のコードについて少し考える必要があるようです。構成ファイルから時刻を取得し、開始時刻が同じであることを確認し、その場合は終了時刻でないことを確認する必要があります。その後、終了時間でない限りtcpdumpを実行する必要があります。終了時間に達したら、tcpdumpを終了する必要があります。私はこれが最善の解決策ではないことを知っていますが、似たようなものと連携させることができれば良いでしょう。
#!/bin/sh
source /media/usbhd-sdb1/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 ]];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 -9 $pid1
echo "autodump stopped"
fi
else
echo "tcpdump not yet started"
fi
done
ベストアンサー1
私が理解したら、しばらくtcpdumpを実行して終了したいということです。次のことができます。
#!/bin/bash
sudo tcpdump -i eth0 -w /media/usbhd-sd[b-c]1/abfrage2.pcap &
PID=$!
sleep 20
sudo kill -9 $PID
exit 0
$!
起動コマンドのpidを提供します。これを終了するには、kill [Signal] [PID]
kill tcpdumpコマンドを呼び出すだけです。
tcpdumpを実行していることに注意してください。背景&
コマンドの最後に追加します。それ以外の場合は、tcpdumpは引き続き実行されます。展望。これにより、exit 0
スクリプトが最後に終了します。
【概念の証拠】
bash -x a.sh
+ PID=21988
+ sleep 10
+ tcpdump -i eth0 -w abfrage2.pcap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
+ kill -9 21988
+ exit 0
[または]
Ericが提案したように、次のようにすることもできます。停止する注文する
#!/bin/bash
timeout 10s tcpdump -i eth0 -w abfrage2.pcap
exit 0