Bash script OU edição

1

Eu tenho o script abaixo e basicamente o que eu quero fazer é conectar-se aos vários servidores. Veja quantos arquivos abertos existem e envie um email se tiver mais de 50.000. Mas o último servidor eu preciso dessa verificação para mais de 400.000. Eu tenho um problema com o OR que não está funcionando.

Se eu executar este script atual, recebo o e-mail de alerta, mesmo que nenhum dos limites tenha sido atingido. Por favor me ajude com a minha declaração OR.

Minha saída na linha de comando mostra:

Alert Server Issue 
AlertError S1:6326 S2:6355 S3:6242 S4:7171 S5:4694 S6:5284 S7:3973 S8:308432

O script:

#!/bin/bash
S1_IP=72.15.97.13
S2_IP=72.15.97.14
S3_IP=72.15.97.15
S4_IP=72.15.97.16
S5_IP=72.15.97.17
S6_IP=72.15.97.18
S7_IP=72.15.97.19
S8_IP=72.15.97.20

RESULT1=$(ssh test@$S1_IP lsof | wc -l)
RESULT2=$(ssh test@$S2_IP lsof | wc -l)
RESULT3=$(ssh test@$S3_IP lsof | wc -l)
RESULT4=$(ssh test@$S4_IP lsof | wc -l)
RESULT5=$(ssh test@$S5_IP lsof | wc -l)
RESULT6=$(ssh test@$S6_IP lsof | wc -l)
RESULT7=$(ssh test@$S7_IP lsof | wc -l)
RESULT8=$(ssh test@$S8_IP lsof | wc -l)

ERROR_COUNT=0

if [[ $RESULT1 || $RESULT2 || $RESULT3 || $RESULT4 || $RESULT5 || $RESULT6 || $RESULT7 -gt 50000 ]] || [[ $RESULT8 -gt 400000 ]]
then

    ERRORS[$ERROR_COUNT]="AlertError"
    ERROR_COUNT=$(($ERROR_COUNT+1))
fi
if [ $ERROR_COUNT -gt 0 ]
then
    [email protected]
    SUBJECT="Over 50,000"
    BODY='Alert Server Issue'
    CNT=0
    while [ "$CNT" != "$ERROR_COUNT" ]
    do
        BODY="$BODY ${ERRORS[$CNT]}
S1:$RESULT1
S2:$RESULT2
S3:$RESULT3
S4:$RESULT4
S5:$RESULT5
S6:$RESULT6
S7:$RESULT7
S8:$RESULT8"
        CNT=$(($CNT+1))
    done
    echo $SUBJECT
    echo $BODY
    echo $BODY | mail -s "$SUBJECT" -a "From: [email protected]" $EMAIL
else
    echo "I can handle it
S1:$RESULT1
S2:$RESULT2
S3:$RESULT3
S4:$RESULT4
S5:$RESULT5
S6:$RESULT6
S7:$RESULT7
S8:$RESULT8"
fi
    
por jaseUK 14.12.2015 / 10:37

2 respostas

4

De info invocação de teste do coreutils '

If EXPRESSION is a single argument, 'test' returns false if the
argument is null and true otherwise

então, ter o seguinte em seu código é avaliado como true .

if [[ $RESULT1 || ...

Você deseja especificar explicitamente $ RESULT1 -gt 50000 para todos os argumentos e não apenas para o último.

    
por 14.12.2015 / 10:59
3

Com meu chapéu para nkms , sugiro o seguinte:

#!/bin/bash

RESULT[1]=2
RESULT[2]=4
RESULT[3]=8
RESULT[4]=16
RESULT[5]=99999
RESULT[6]=32
RESULT[7]=64
RESULT[8]=128
RESULT[9]=256

for result in ${RESULT[*]}
do
    if [[ $result -gt 50000 ]]; then
        echo big result $result
    fi
done

A repetição de -gt 50000 repetidas vezes é propensa a erros. Mesmo se você acertar uma vez, o que acontece quando alguém aparece e tenta adicionar outro resultado? Um loop é mais fácil de manter e dimensionar. E se você vai fazer um loop sobre cada um dos resultados, por que não colocá-los em uma matriz?

Se você quiser estender isso para o resto do seu script, você pode colocar seus endereços IP em uma matriz também.

    
por 14.12.2015 / 17:41