2013-04-20 2 views
1

Я написал сценарий для расчета использования полосы пропускания контейнера 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]} 

Может ли кто-нибудь указать мне в правильном направлении? Я думаю, что скрипт почти закончен, возможно, что-то очень простое.

+0

Этот сценарий является слишком долго, чтобы ожидать, что другие, чтобы прочитать все это смотрит за ошибку. Можете ли вы опубликовать [SSCCE] (http://sscce.org/)? –

+0

Проблема в том, что я не уверен, в чем проблема - сообщения об ошибках не сообщаются. Главное, что я заметил, это то, что 'bytes [i] = $ byte' установлено, а затем' echo $ {bytes [i]} 'ничего не возвращает. – James

+0

'while [1]' не делает то, что вы думаете. Это происходит в цикле, как вы ожидаете, но 'while [0]' будет делать то же самое; с 1 аргументом (0/1) это истинно, если аргумент не равен "" "". Вместо этого используйте 'while true'. – Kevin

ответ

0

Ваша оболочка запускает while read петлю в субоболочке (см here, почему он не работает, как ожидалось), так что ваша магия массив не распространяется за пределы tail | while конструкции.

Читать this и исправить соответственно :-)

+0

Работает очарование. Если бы я мог купить тебе пиво, я бы это сделал. – James

+0

Я вернусь к тому, что я должен когда-нибудь зайти в Ланкастер :-) –

Смежные вопросы