Как ждать завершения задачи перед продолжением сценария оболочки - PullRequest
1 голос
/ 21 июля 2010

У меня есть два сценария оболочки, которые будут выполняться ночью по расписанию cron.

На моем производственном сервере:

  1. mysqldump -ufoo -pbar --opt --routines db > ~/sqldump/{$todays_date}.sql
  2. ln -s ~/sqldump/{$todays_date}.sql latest.sql

На моем сервере разработки:

  1. scp foo@domain.tld:~/sqldump/latest.sql ~/sqldump
  2. mysql -ufoo -pbar db < latest.sql

У меня два вопроса:

  1. В задании рабочего сервера, как мне получить $todays_date, чтобы заполнить дату? например, "2010-07-21"
  2. Как заставить второй шаг ждать завершения первого шага в каждой работе?

Ответы [ 2 ]

3 голосов
/ 21 июля 2010

Чтобы получить сегодняшнюю дату, используйте date +%F:

command > ~/sqldump/$(date +%F).sql

Чтобы узнать больше о различных параметрах, которые вы можете использовать с форматированием даты +, обратитесь к справочной странице даты.

Что касается ожидания, я предполагаю, что вы имеете в виду, что вы не хотите запускать команду на своем dev-сервере до тех пор, пока команды на вашем prod-сервере не будут выполнены. Лучше всего, чтобы dev-сервер запускал команду с использованием ssh (т.е. ssh user@host "mysqldump ... > ... && ln -s ...).

Если вы не хотите этого делать, лучшее, что я могу придумать, - это использовать временный файл, чтобы создание файла дампа было атомарным:

mysqldump ... > ~/sqldump/tmp$$ && mv ~/sqldump/tmp$$ ~/sqldump/$(date +%F).sql

Тогда, если у вас есть запрос к серверу dev на дамп с сегодняшней даты, вы можете зацикливаться, пока scp не будет выполнен успешно:

while ! scp foo@domain.tld:~/sqldump/$(date +%F).sql ~/sqldump; do
    # file not present yet, sleep 1 minute and try again
    sleep 60
done
mysql -ufoo -pbar db < latest.sql
2 голосов
/ 21 июля 2010

Если вы не используете «&» в конце команды для первого шага, второй шаг будет автоматически ожидать его.

...