Как заставить скрипт в bash знать, что сервер все еще занят установкой / настройкой и ждет перезагрузки? - PullRequest
1 голос
/ 08 октября 2019

Проблема / дилемма

В настоящее время я занят созданием сценария для удаленного запуска серверов (с CentOS 6.x и CentOS 7.x). Пока что скрипт работает, но зависает от одной мелочи. Ну на самом деле это не зависает, но это не дает подробную информацию о том, что происходит. Другими словами, я не получаю верную информацию в bash о том, что работа была завершена правильно.

Я пробовал разные вещи, однако зависает со следующим сообщением (которое повторяется бесконечно):

servername is still installing and configuring packages...
PING 100.125.150.175 (100.125.150.175) 56(84) bytes of data.
64 bytes from 100.125.150.175: icmp_seq=1 ttl=63 time=0.152 ms
64 bytes from 100.125.150.175: icmp_seq=2 ttl=63 time=0.157 ms
64 bytes from 100.125.150.175: icmp_seq=3 ttl=63 time=0.157 ms
64 bytes from 100.125.150.175: icmp_seq=4 ttl=63 time=0.143 ms
64 bytes from 100.125.150.175: icmp_seq=5 ttl=63 time=0.182 ms

--- 100.125.150.175 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 120025ms
rtt min/avg/max/mdev = 0.143/0.158/0.182/0.015 ms

servername is still installing and configuring packages...
PING 100.125.150.175 (100.125.150.175) 56(84) bytes of data.
64 bytes from 100.125.150.175: icmp_seq=1 ttl=63 time=0.153 ms
64 bytes from 100.125.150.175: icmp_seq=2 ttl=63 time=0.132 ms
64 bytes from 100.125.150.175: icmp_seq=3 ttl=63 time=0.142 ms

etc....

Так что по какой-то причине он не ограничивается следующей строкой кода или не выполняет следующее действие. Поскольку это только обратная связь для меня (или другого пользователя), это не главная проблема. Но было бы неплохо получить этот функционал и предоставить (подробную) информацию о текущем прогрессе или о том, что скрипт / сервер фактически делает в данный момент. К сожалению, это не относится к вышеуказанному (последнему) куску кода.

Это текущий фрагмент кода, который у меня есть (да, это беспорядок):

while true;
do
  #ping -c3 -i3 $HWNODEIP  > /dev/null
  #ping -c5 -i30 $HWNODEIP > /dev/null
  ping -c5 -i30 $HWNODEIP
  if [ $? -eq 1 ] || [ $? -eq 2 ] || [ $? -eq 68 ]
  then
    echo -e " "
    echo -e "Kickstart part II also done. $HOSTNAME will be rebooted one more time."
    sleep 5
    ######return 0

        echo -e " "
        printf "%s" "Waiting for $HOSTNAME to come back online: "
        while ! ping -c 1 -n -w 30 $HWNODEIP &> /dev/null
            do
                printf "%c" "."
                #sleep 10
            done

        echo -e " "
        echo -e "Reboot is done and $HOSTNAME is back online. Performing final check. Please wait..."
        sleep 10
        echo -e " "
        sudo /usr/local/collectHWdata.pl $HWNODEIP
        ssh root@$HWNODEIP "while ! test -e /root/kickstart-DONE; do sleep 3; done; echo KICKSTART IS DONE\!"
        echo -e " "
    exit        

  else
    echo -e " "
    echo -e "$HOSTNAME is still installing and configuring packages..."
  fi
done

Sidenote: Я удалил> / dev / null # 5 для отладки (не то, чтобы это помогло)

Я предполагаю, что я использую вещи неправильно, и я ни в коем случае не опытный сценарист;Я могу делать только мелочи, но, конечно, я делаю все возможное. Я дурачился с этим с прошлой недели и до сих пор ничего не получаю в этой части.

Чего я пытаюсь достичь?

Сервер перезагружается после выбранной версии CentOS, создавая разделы инастройка сети. Это все работает. Выше приведенный фрагмент после перезагрузки. Теперь он установит выбранные мной пакеты, настроит различные вещи (например, Nagios) и установит / скомпилирует определенные модули PERL. И еще несколько мелких вещей.

В фоновом режиме это делается правильно. Я хотел сделать скрипт (приведенный выше фрагмент кода), чтобы сервер все еще был занят установкой вещей и тому подобного. Поскольку мне не хватает знаний, чтобы сделать это, я решил использовать другой подход;проверьте, подключен ли сервер к сети (другими словами, он все еще устанавливается). Пока сервер подключен к сети, он все еще явно устанавливает / настраивает. После этого сервер перезагрузится еще раз, чтобы выполнить последние 2 команды (как видно из моего фрагмента). Однако (здесь проблема) он никогда не выполняет эти команды, хотя кикстарт полностью выполнен.

Так что я предполагаю, что я делаю что-то не так и даже могу испортить вещи (или запутался при этом). Может быть, у кого-то есть идея, решение или совершенно другой подход к решению и решению этой проблемы (или, по крайней мере, я на это надеюсь).

Другие вещи, которые я пробовал до сих пор? Ну, я пробовал различные команды ping, и я также пробовал nc (netcat), но также без хорошего результата. Я каждый раз ударяю кирпичную стену последними двумя командами, и она продолжает пинговать, вместо того, чтобы показывать, что кикстарт был сделан ... Я думаю, что потратил несколько часов (с прошлой недели) на это уже, не доходя никуда.

Так что я надеюсь, что кто-то может взглянуть на это и сказать мне, что я делаю неправильно, и, возможно, есть лучший подход (кроме проверки связи с сервером), чтобы проверить, все еще ли он занят. Возможно (удаленная) проверка yum, perl или службы, чтобы скрипт знал, что он все еще занят.

Извините за длинный пост, но я знаю, когда предоставляю как можно больше информации, включаяпримеры кода и результаты, это более "ценится". Поэтому я надеюсь, что предоставил адекватную информацию. Если нет, дайте мне знать. Я постараюсь добавить как можно больше информации. Как всегда, я всегда готов изучить или изменить свой подход.

Спасибо, что уже прочитали мой пост!

1 Ответ

1 голос
/ 10 октября 2019

Как отмечено в комментариях к вопросу:

  • Сервер может быть уже перезагружен к моменту окончания ping -c5 -i30 $HWNODEIP. Команда отправляет 5 пакетов (-c флаг), ожидая 30 секунд между каждым пакетом (-i interval флаг). То есть 5 * 30 = 150 секунд, что немного больше, чем 2 минуты. Сервер может нормально перезагрузиться в течение 2 минут, особенно если используется SSD. Поэтому попробуйте уменьшить общее время, необходимое для выполнения этой команды.

  • [ $? -eq 68 ], вероятно, не требуется. $HWNODEIP - это просто ip-адрес, а код выхода 68 - для доменного имени , которое не разрешается, что не относится к IP-адресам.

  • if утверждение может быть упрощено до

    if ! ping -c5 -i30 "$HWNODEIP"  
    

Это незначительные предложения, вероятно, не пуленепробиваемые. Как подтвердил ОП в комментариях, помогает снижение интервала. Есть и другие небольшие улучшения (например, цитирование переменных), но это выходит за рамки вопроса, поэтому я оставлю это сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...