Bash l oop, два условия, первое должно быть истинным и являющееся частью цикла - PullRequest
0 голосов
/ 05 мая 2020

Я мигрирую кучу контейнеров openvz и могу делать только один за раз по причинам. Это отнимает очень много времени, и если я не наблюдаю за целевым узлом постоянно, я не буду знать, завершатся ли миграции или завершатся они.

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

У меня есть вторая часть этого рабочего процесса, пока я Я не уверен, что это лучший способ go об этом, и мне нужна первая часть, чтобы убедиться, что контейнер существует для работы. Очевидно, что оба этих теста необходимо запускать каждые l oop в случае сбоя миграции. Я просто не могу понять, как это сделать.

Вот что у меня есть:

#!/bin/bash
read -p "Container ID: " -e CID
until vzlist -a | grep $CID | grep running
do
        sleep 600
done
echo "Migration of container $CID complete" | mail -s "Migration complete" red@cted.com

1 Ответ

1 голос
/ 07 мая 2020

Если я понимаю, как правильно интерпретировать vxlist -a, должно получиться что-то вроде этого:

#!/bin/bash

emailTarget="red@cted.com"

read -p "Container ID: " -e CID

while true; do    # This loops until something `break`s it out of the loop

    # Capture the container status, so we can run multiple checks with
    # only one run of `vzlist`.
    containerStatus=$(vzlist -a | grep "$CID")


    if [[ -z "$containerStatus" ]]; then
        # If the the result was the empty string, our container is not
        # in the list, so apparently it's failed.
        echo "Migration of container $CID failed" | mail -s "Migration failed" "$emailTarget"
        break

    elif [[ "$containerStatus" = *"running"* ]]; then
        # It's in the list *and* has "running" status -- migration succeeded!
        echo "Migration of container $CID complete" | mail -s "Migration complete" "$emailTarget"
        break
    fi

    # If neither of those conditions was met, it's still trying;
    # wait 10 minutes and check again.
    sleep 600
done
...