我对 Shell 比较陌生,我一直在尝试在 Shell 中使用数组,但效果不佳。如果 OpenVZ 容器在一段时间内达到一定的带宽阈值,我正在尝试编写一个脚本来暂停它们。
我的脚本:
#!/bin/bash
#Thresholds are in bytes per second and count1 must > count2
LOGDIR="/var/log/outbound_ddos"
SECS=10
THRESHOLD1=65536000
COUNT1=10
THRESHOLD2=117964800
COUNT2=2
while [ 1 ]
do
for veid in $(/usr/sbin/vzlist -o veid -H)
do
# Create the log file if it doesn't already exist
if ! test -e $LOGDIR/$veid.log; then
touch $LOGDIR/$veid.log
fi
# Parse out the inbound/outbound traffic and assign them to the corresponding variables
eval $(/usr/sbin/vzctl exec $veid "grep venet0 /proc/net/dev" | \
awk -F: '{print $2}' | awk '{printf"CTOUT=%s\n", $9}')
# Print the output and a timestamp to a log file
echo $(date +%s) $CTOUT >> $LOGDIR/$veid.log
# Read last 10 entries into arrays
i=0
tail $LOGDIR/$veid.log | while read time byte
do
times[$i]=time; bytes[$i]=byte
let i++
done
# Sanity checks and calculations
for (( i=0; i<COUNT1; i++ ))
do
# Sanity check on the time
if (( times[$i] > times[$i - 1] + $SECS + 10 ))
then continue
fi
# Calculate differences
let "diff[$i] = bytes[$i+1] - bytes[$i]"
done
# Work out thresholds and suspend where necessary
# Higher threshold first
t2=0
for (( i=COUNT1-1; i>=0; i-- ))
do
if [ ! diff[$i] ]
then continue
else
if (( bytes[$i] < THRESHOLD1 * SECS + bytes[$i-1] + 1 ))
then continue
else let t2++
fi
fi
done
#Lower threshold last
t1=0
for (( i=COUNT1-1; i>=0; i-- ))
do
if [ ! diff[$i] ]
then continue
else
if (( bytes[$i] < THRESHOLD1 * SECS + bytes[$i-1] + 1 ))
then continue
else let t1++
fi
fi
done
# Suspend where necessary
if (( ($t2 >= $COUNT2) || ($t1 >= $COUNT1) ))
then vzctl stop veid
fi
done
sleep $SECS
done
和错误:
script.sh: line 38: times: bad array subscript
script.sh: line 54: bytes: bad array subscript
script.sh: line 67: bytes: bad array subscript
我尝试了数组下标的几种变体,但似乎无法摆脱这些错误。