Bash循环有两个条件,第一个条件必须为true,并且是循环的一部分

Bash循环有两个条件,第一个条件必须为true,并且是循环的一部分,bash,if-statement,while-loop,Bash,If Statement,While Loop,我正在迁移一堆openvz容器,由于种种原因,一次只能迁移一个。这非常耗时,如果我不经常观察目标节点,我就不知道迁移是否失败或完成 因此,我正在尝试编写一个小shell脚本来完成两件事。首先,确保正在迁移的容器ID显示在容器列表中。如果没有,请退出脚本并向我发送电子邮件。第二,只要第一个条件为真,观察容器的状态是否变为正在运行,一旦变为真,就给我发一封电子邮件 我有这个工作的第二部分,直到,我不确定这是最好的方式去做,虽然我需要第一部分,确保容器存在的工作以及。显然,这两个测试都需要运行每个循环

我正在迁移一堆openvz容器,由于种种原因,一次只能迁移一个。这非常耗时,如果我不经常观察目标节点,我就不知道迁移是否失败或完成

因此,我正在尝试编写一个小shell脚本来完成两件事。首先,确保正在迁移的容器ID显示在容器列表中。如果没有,请退出脚本并向我发送电子邮件。第二,只要第一个条件为真,观察容器的状态是否变为正在运行,一旦变为真,就给我发一封电子邮件

我有这个工作的第二部分,直到,我不确定这是最好的方式去做,虽然我需要第一部分,确保容器存在的工作以及。显然,这两个测试都需要运行每个循环,以防迁移失败。我就是不知道该怎么做

以下是我到目前为止的情况:

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

如果我理解了如何正确解释
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

我会使用两个独立的循环;首先,一个
until vzlist-a | grep$CID
循环,等待它出现在列表中(以及某种超时触发器,用于发送“it failed”电子邮件并退出脚本)。然后,第二个循环等待“运行”状态。超时的唯一问题是,一些容器需要20分钟才能迁移,而其他容器可能需要几个小时。这完全取决于要移动的数据量。因此,如果我为更大的容器留出几个小时,它可能早在我收到电子邮件之前就失败了。是否有任何方法(可以编写脚本)来判断迁移是否失败,或者只是还没有成功?否则,完全编写脚本基本上是不可能的。您可以做的是,如果迁移似乎花费了异常长的时间,它会通知您,要求您手动调查迁移是否失败或只是缓慢,如果只是缓慢,则重置观察者脚本。一旦迁移开始,在您运行vzlist-a时会显示容器ID。那就是我开始写剧本的时候了。当迁移失败时,当运行vzlist-a时,容器将从列表中删除。因此,我可以运行vzlist-a | grep$CID,只要返回true,脚本就可以继续运行并检查迁移是否完成。如果vzlist-a | grep$CID返回false,它应该向我发送一封电子邮件并退出。这正是我所需要的,并且工作得非常完美。非常感谢。