ajuda do script BASH para reinicialização do processo

2
#!/bin/bash

check='monStatus.sh -p appName:Tomcat |head -2 |tail -1 | nawk '{print $2}''

if [ "$check" != "offline" ]; then
  #echo "Tomcat still running"
  sleep 90
else
  #echo "Restarting Tomcat"
  RestartTomcat.sh
fi

Aqui está o fragmento do shell. Meu problema é esse. Eu preciso que o primeiro então seja como sleep 90 E, em seguida, execute a instrução if / then / else novamente, basicamente, até que seja concluído no else, que então reiniciará o Tomcat, uma vez que ele não diz execução. Eu não posso envolver meu cérebro em torno de como fazer um loop.

    
por Wes Neal 12.03.2018 / 17:08

1 resposta

3

Se você precisar repetir o script indefinidamente, use um aninhado while loop:

while true; do
    # Do something, for example output the current date and time:
    printf '%(%c)T\r' -1 
done
  • Em seu código de exemplo, você está usando o estilo antigo para quebra de saída de sub-shells. Como diz o @ThomasWard : "a maioria dos guias de Bash não recomendam o uso de backticks e, em vez disso, sugerem comandos dentro de $( ) , ou seja, $(monStatus.sh -p appName:Tomcat | head -2 | tail -1 | nawk '{print $2}') . Esta é realmente a maneira mais recomendada de fazer a captura de saída de subshell como uma variável ou como substituição hoje em dia. "

    Como @dessert diz, "note que há realmente uma diferença entre os backticks e a sintaxe $(…) : quando o é usada a forma de substituição backquote de estilo antigo, a contrabarra retém seu significado literal, exceto quando seguida por $ , ' ou \ - compare as saídas de echo $(echo \ ) e echo 'echo \ ' ! "

  • Além disso, você pode simplificar mais algumas coisas:

    Use nawk 'FNR==2{print $2}' em vez de head -2 | tail -1 | nawk '{print $2}' .

    Use o teste interno de Bash em [ (consulte man test e this resposta), o 'e' operador de lista && e positivo ( == , -eq ) em vez de condição negativa ( != , -ne ).

    #!/bin/bash
    while true; do
        sleep 90
        [[ $(monStatus.sh -p appName:Tomcat | nawk 'FNR==2{print $2}') == 'offline' ]] && RestartTomcat.sh
    done
    

Mas, de acordo com o comentário "após a reinicialização, ele deve terminar" , a sugestão correta é usar while com uma condição:

#!/bin/bash
while [[ $(monStatus.sh -p appName:Tomcat | nawk 'FNR==2{print $2}') -ne offline ]]
do 
    sleep 90
done
RestartTomcat.sh

Ou, se você quiser usar uma condição positiva, o loop until pode ser implementado da mesma maneira:

#!/bin/bash
until [[ $(...) -eq offline ]]; do sleep 90; done; RestartTomcat.sh
    
por pa4080 12.03.2018 / 20:07