Сценарий Bash помогает для перезапуска процесса

#!/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

Вот отрывок оболочки. Моя проблема - это. Мне нужно первое затем, чтобы быть похожим sleep 90 И затем пробегите if/then/else оператор снова в основном, пока это не еще, завершается на, который затем перезапустит Tomcat, после того как это не говорит выполнение. Я не могу перенести мозг, как циклично выполнить его.

2
задан 12 March 2018 в 19:10

1 ответ

Если необходимо повторить документ на получение бесконечно, можно использовать вложенный while цикл:

while true; do
    # Do something, for example output the current date and time:
    printf '%(%c)T\r' -1 
done
  • В Вашем примере кода Вы используете старый стиль для выходного обертывания подоболочки. Поскольку @ThomasWard говорит: "большинство руководств Bash не рекомендует использование обратных галочек и вместо этого предлагает перенести Ваши команды в $( ), т.е. $(monStatus.sh -p appName:Tomcat | head -2 | tail -1 | nawk '{print $2}'). Это - на самом деле более рекомендуемый способ сделать выходное получение подоболочки как переменную или как замена в наше время."

    Как @dessert говорит, "примечание, там на самом деле различие между обратными галочками и $(…) синтаксис: Когда форма одинарной левой кавычки старого стиля замены используется, обратная косая черта сохраняет свое буквальное значение кроме тех случаев, когда сопровождаемый $, `, или \. – сравнивают выводы echo $(echo \\ ) и echo `echo \\ `!"

  • Кроме того, можно упростить еще немного вещей:

    Использовать nawk 'FNR==2{print $2}' вместо head -2 | tail -1 | nawk '{print $2}'.

    Используйте Bash встроенный тест [ (см. man test и этот ответ), 'и' оператор списка &&, и положительный (==, -eq) вместо отрицательного (!=, -ne) условие.

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

Но, согласно комментарию "после того, как это выполняет перезапуск, который это должно закончить", корректное предложение состоит в том, чтобы использовать while с условием:

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

Или если Вы хотите использовать положительное условие, until цикл может быть реализован таким же образом:

#!/bin/bash
until [[ $(...) -eq offline ]]; do sleep 90; done; RestartTomcat.sh
3
ответ дан 2 December 2019 в 02:43

Другие вопросы по тегам:

Похожие вопросы: