2013-12-11 5 views
1

я должен сделать что-то вроде этого:Как использовать цикл while для проверки состояния в linux?

while (condition) 

do 
wait 

Я должен сделать это в Linux. Пока состояние моментального снимка находится в ожидании, он должен ждать.

Содержание ec2-описания снимок:

SNAPSHOT snap-c7f3 vol-f6a0 completed 2013-12-04T09:24:50+0000 100% 109030037527 10 2013-12-04: Daily Backup for SaMachine (VolID:vol-f09a0 InstID:i-2604) 
SNAPSHOT snap-c7df9 vol-3f6b completed 2013-12-04T09:24:54+0000 100% 109030037527 10 2013-12-04: Daily Backup for sa_test_VPC (VolID:vol-3InstID:i-e1c46) 

Как это сделать? Как использовать grep и все такое?

#!/bin/bash 

# Setting the environmental variables 

export EC2_HOME=/opt/ec2/tools 
export AWS_ACCESS_KEY_ID= 
export AWS_SECRET_ACCESS_KEY= 
export SOURCE_REGION="us-west-2" 
export DESTINATION_REGION="us-east-1" 


# Set the variable today-date to current date 
today_date=`date +%Y-%m-%d` 
echo "$today_date" 


# Set the variable date_dir to yesterday's date 
date_dir=$(date +%Y-%m-%d -d '-1 days') 
echo "$date_dir" 


#First delete all snapshots older than one day 
#Create a file with all scheduled snapshots 

echo "First delete all snapshots older than one day" 
echo "Create a file with all scheduled snapshots" 
read -rsp $'Press enter to continue...\n' 
ec2-describe-snapshots | grep -i "$date_dir">"$EC2_HOME/SnapshotsDOW_$today_date" 


#Delete snapshots for older backups 

echo "Delete snapshots for older backups" 
read -rsp $'Press enter to continue...\n' 
for snapshot in $(cat "$EC2_HOME/SnapshotsDOW_$today_date" | awk '{print $2}') 
    do 
     ec2-delete-snapshot $snapshot 
done 


#Now create a snapshot for every attached volume to every instance 
#Create a file with all attached volumes 

echo "Create a file with all attached volumes" 
read -rsp $'Press enter to continue...\n' 
#ec2-describe-volumes | grep -i "attached" >"$EC2_HOME/ActiveVolumes_$today_date" 


#Create a file with all instances 

echo "Create a file with all instances" 
read -rsp $'Press enter to continue...\n' 
ec2-describe-instances | grep -i "tag" | grep -i "name" >"$EC2_HOME/Instances_$today_date" 


#Create snapshots of all attached volumes 

echo "Create snapshots of all attached volumes" 
read -rsp $'Press enter to continue...\n' 
awk '{print $2, $3}' "$EC2_HOME/ActiveVolumes_$today_date" | while read vol_id inst_id; do 
    awk '{print $3, $5}' "$EC2_HOME/Instances_$today_date" | while read inst_id2 name; do 
     if test "$inst_id" = "$inst_id2"; then 
      echo ec2-create-snapshot "$vol_id" -d "$today_date: Daily Backup for $inst_id (VolID:$vol_id InstID:$inst_id)" 
      ec2-create-snapshot "$vol_id" -d "$today_date: Daily Backup for $inst_id (VolID:$vol_id InstID:$inst_id)" 
     fi 
    done 
done 



#Create a file with all latest snapshots 

echo "Create a file with all latest snapshots" 
read -rsp $'Press enter to continue...\n' 
latestdate=$(ec2-describe-snapshots | grep ^SNAPSHOT | sort -rk 5 | awk '{print substr($5, 1, 10); exit}') 
ec2-describe-snapshots | grep "^SNAPSHOT.*$latestdate" > "$EC2_HOME/SnapshotsLatest_$today_date" 


#Copy the snapshot across multiple regions. 

echo "Copy the snapshot across multiple regions." 
read -rsp $'Press enter to continue...\n' 
for snapshot in $(cat "$EC2_HOME/SnapshotsLatest_$today_date" | awk '{print $2}') 
do 
    ec2-copy-snapshot -r $SOURCE_REGION -s $snapshot -region $DESTINATION_REGION 
done 


#Send the latest snapshot details to user using mail command. 
echo "Send the latest snapshot details to user using mail command" 
read -rsp $'Press enter to continue...\n' 
mail -s 'VM Snapshot $today_date' jp.com < "$EC2_HOME/SnapshotsLatest_$today_date" 

read -rsp $'Press enter to exit...\n' 
+0

Какую команду вы используете, чтобы получить этот вывод? –

+0

ec2-describe-snapshots (утилита командной строки ec2) – user3086014

+0

Вам нужны все снимки, которые нужно выполнить, или вы просто ищете конкретный снимок? –

ответ

2

Запись, что while петля так просто, как это:

while ec2-describe-snapshots | grep -q '^SNAPSHOT.*pending' 
do 
    echo "There are pending SNAPSHOTs, waiting..." 
    sleep 10 
done 
echo "No pending SNAPSHOTs." 
+0

Привет, janos, я снова пишу сценарий оболочки и нуждаюсь в вашей помощи. Я отправил новый запрос на любезность. Спасибо – user3086014

+0

, пожалуйста, взгляните на мои вопросы. Im застрял только вы можете мне помочь: (\ – user3086014

+0

Слава богу, там. Пожалуйста, см. Мой вопрос !!!!мой новый вопрос – user3086014

1
until ec2-describe-snapshots | grep -q ' completed ' 
do 
    echo "snapshot is pending, still waiting..." 
    sleep 10 
done 
echo "snapshot completed." 

Если вам нужны все снимки должны быть завершены, можно использовать вместо:

until ! ec2-describe-snapshots | grep -q ' pending ' 
do 
    echo "snapshot is pending, still waiting..." 
    sleep 10 
done 
echo "snapshot completed." 

UPDATE

И, чтобы обрабатывать также не выходной случай:

until [ -n "`ec2-describe-snapshots`" ] 
do 
    echo "snapshot not yet started, still waiting..." 
    sleep 10 
done 
until ! ec2-describe-snapshots | grep -q ' pending ' 
do 
    echo "snapshot is pending, still waiting..." 
    sleep 10 
done 
echo "snapshot completed." 
+0

@macros: error: cat: 'ec2-describe-snapshots: Нет такого файла или каталога моментальный снимок ожидается, ждет ...' – user3086014

+0

ec2-describe-snapshots - это команда, а не файл. ps – user3086014

+0

Извините, не используйте 'cat' ... Я забыл удалить его после моего теста с выводом команды, который вы дали ... ;-) Я уже исправил ответ ... – MarcoS

1

Если вы можете поместить его в shellscript, вот как я это сделаю.

Редактировать

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

# This is where you're creating your snapshots... 

# Setup the command. 
command=`ec2-describe-snapshots | grep pending | wc -l` 

# Check if we have any pending snapshots at all. 
if [ $command == "0" ] 
then 
     echo "No snapshots are pending." 
     ec2-describe-snapshots 
else 
     # Wait for the snapshot to finish. 
     while [ $command != "0" ] 
     do 
       # Communicate that we're waiting. 
       echo "There are $command snapshots waiting for completion." 
       sleep 5 

       # Re run the command. 
       command=`ec2-describe-snapshots | grep pending | wc -l` 
     done 

     # Snapshot has finished. 
     echo "Snapshots are finished." 
fi  

# This is where you're writing snapshots to file... 

Старый скрипт для справок

#!/bin/sh 

waitForSnapshot() { 
     # Make sure we actually passed a snapshot to grep for. 
     if [ -n "$1" ] 
     then 
       # Setup the command. 
       command=`ec2-describe-snapshots | grep $1 | awk '{print $4}'` 

       # Wait for the snapshot to finish. 
       while [ $command != "completed" ] 
       do 
         sleep 1 

         # Re run the command. 
         command=`ec2-describe-snapshots | grep $1 | awk '{print $4}'` 
       done 

       # Snapshot has finished. 
       echo "Snapshot '$1' has finished." 
     else 
       echo "No snapshot was passed to us." 
     fi 

} 

waitForSnapshot "snap-c7f3" 
+0

, он будет работать только для одного моментального снимка или всего моментального снимка, возвращаемого командой? – user3086014

+0

и почему вы сделали это в функции. пожалуйста, не делайте это как функция. в моем скрипте нет функции – user3086014

+0

Это работает для одного моментального снимка. Причина, по которой я превратил ее в функцию, состоял в том, чтобы вы могли повторно использовать один и тот же код для ожидания любого количества снимков по вашему выбору.Вы просто вызываете waitForSnapshot «snapshotName» столько раз, сколько хотите. –

Смежные вопросы