Я написал сценарий для расчета использования полосы пропускания контейнера OpenVZ с течением времени и приостановил его, если он слишком быстро использует слишком много. Вот сценарий до сих пор:Сравнение элементов массива
#!/bin/bash
# Thresholds are in bytes per second
LOGDIR="/var/log/outbound_ddos"
THRESHOLD1=65536
THRESHOLD2=117964
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
# Time checks & calculations for higher threshold
counter=0
for ((i=0; i<9; i++))
do
# If we have roughly the right timestamp
if ((times[9-i] < times[8-i] + 20))
then
# If the user has gone over the threshold
if ((bytes[9-i] > bytes[8-i] + THRESHOLD2 * 10))
then let ++counter
fi
fi
done
# Now check counter
if ((counter == 9))
then vzctl stop $veid
fi
# Same for lower threshold
counter=0
for ((i=0; i<3; i++))
do
# If we have roughly the right timestamp
if ((times[3-i] < times[2-i] + 20))
then
# If the user has gone over the threshold
if ((bytes[3-i] > bytes[2-i] + THRESHOLD1 * 10))
then let ++counter
fi
fi
done
# Now check counter
if ((counter == 2))
then vzctl stop $veid
fi
done
sleep 10
done
Я проверил номера в /var/log/outbound_ddos/vm101.log и они увеличивается более, чем порог, но ничего не происходит.
Я добавил некоторые эхо заявления, чтобы попытаться выяснить, где проблема и это, кажется, это сравнение, что это возвращение ложным:
if ((bytes[9-i] > bytes[8-i] + THRESHOLD2 * 10))
Итак, я попытался следующий, который не печатается ничего:
echo ${bytes[9-i]}
Может ли кто-нибудь указать мне в правильном направлении? Я думаю, что скрипт почти закончен, возможно, что-то очень простое.
Этот сценарий является слишком долго, чтобы ожидать, что другие, чтобы прочитать все это смотрит за ошибку. Можете ли вы опубликовать [SSCCE] (http://sscce.org/)? –
Проблема в том, что я не уверен, в чем проблема - сообщения об ошибках не сообщаются. Главное, что я заметил, это то, что 'bytes [i] = $ byte' установлено, а затем' echo $ {bytes [i]} 'ничего не возвращает. – James
'while [1]' не делает то, что вы думаете. Это происходит в цикле, как вы ожидаете, но 'while [0]' будет делать то же самое; с 1 аргументом (0/1) это истинно, если аргумент не равен "" "". Вместо этого используйте 'while true'. – Kevin