2012-04-23 39 views
1

我正在编写我的amazon部署,并且我还没有设法自动执行一个步骤。Boto - 如何在运行新命令之前等待后台进程(例如mdadm)完成?

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

sudo mdadm --detail /dev/md0 

当mdadm的工作仍在进行中这个命令会产生一个进度指示器例如:

Rebuild Status : 2% complete 

当mdadm的完成这一地位将不复存在。

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

在我考虑将使用博托各种包装盒上的一个剧本的那一刻,从运行的宝途脚本,让脚本退出,一旦它解析并读取mdadm已完成......

谢谢很多为您的帮助!

+0

该脚本是用哪种语言编写的?如果是bash脚本,你可以用'cut'来玩。 – gabrielhpugliese 2012-04-24 01:00:44

+0

为建议欢呼 - 我会看看它 - 我在想bash脚本,所以我不需要事先安装任何东西! 当我接近它时,会发布脚本;) – 2012-04-25 12:45:11

回答

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运行脚本。

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... 
2

我使用:

mdadm --wait /dev/md0 

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

+0

不幸的是,没有办法指定超时。 – iElectric 2016-04-06 12:14:27

相关问题