Boto - 如何在运行新命令之前等待后台进程(例如mdadm)完成?

时间:2012-04-23 12:37:30

标签: deployment amazon-ec2 boto raid

我正在编写我的亚马逊部署脚本,但我还没有成功实现自动化步骤。

步骤介于设置RAID(通过mdadm),然后在新安装的目录上安装我的db(mongo)。这是因为在安装mongo之前我必须等待mdadm在后台完成。通过运行以下命令,我知道mdadm何时完成:

sudo mdadm --detail /dev/md0

当mdadm仍在进行时,此命令将生成一个进度指示器,例如:

 Rebuild Status : 2% complete

当mdadm完成后,此状态将消失。

有没有人有一个干净的解决方案能够告诉mdadm何时完成,以便脚本可以完全独立运行,然后在mdadm完成后继续安装mongo?

目前我正在考虑使用boto在盒子上放置一个类别的脚本,从boto运行脚本,并在解析并读取mdadm完成后让脚本退出...

非常感谢你的帮助!

3 个答案:

答案 0 :(得分:2)

我正在使用:

 mdadm --wait /dev/md0

请注意,如果上述命令不必等待,则返回非零退出状态...您可能需要在脚本中考虑这一点。

答案 1 :(得分:0)

好的......所以我说我会发布我的解决方案(我对编写bash脚本是全新的,所以如果你有任何改进的建议,我会全神贯注! !)

#!/bin/bash

false=1
true=0

function drives_are_ready {
  RAID_INFO=`sudo mdadm --detail /dev/md0`
  rebuild_status_line_count=`echo "$RAID_INFO" | grep "Rebuild Status" | wc -l`
  echo `echo "$RAID_INFO" | grep "Rebuild Status"`
  if (( rebuild_status_line_count == 0 )); then
    return $true
  else
    return $false
  fi
}

drives_are_ready
raid_is_finished=$?

while (( raid_is_finished == $false )); do
  echo "RAID isn't finished yet... will check again in 10s"
  sleep 10s
  drives_are_ready
  raid_is_finished=$?
done

echo "RAID is done."

我将文件scp到我的实例,然后chmod并通过boto运行脚本。

答案 2 :(得分:0)

在使用磁盘之前,您不一定需要等待超级块重新同步,但在我的(我也确定您的经验)体验中,使用ec2实例是一个非常好的主意。

你可以简单地在bash while循环中检查它

#!/bin/bash

... stuff in your script that doesn't require raid ...

# Pause until mdadm --detail returns nothing
while [[ `sudo mdadm --detail /dev/md0 | grep 'Rebuild Status'` != '' ]] do
  sleep 30
done

echo "Raid superblock resynchronization complete"

... stuff in your script that requires raid synchronization to be complete...