2014-01-04 6 views
0

У меня есть сценарий резервного копирования написано, что будет делать следующее в следующем порядке:Простой Баш скрипт работает асинхронно, когда запускается как хрон

  1. застегивать файлы через SSH на удаленный сервер резервного копирования
  2. дамп мой локальная база данных
  3. Передача моя локальная база данных через SSH Rsync на резервный сервер

Теперь, когда я запускаю этот скрипт из командной строки в RHEL он работает нормально-прекрасно.

BUT Когда я установил этот скрипт для запуска через cronjob, сценарий запускается, но из того, что я могу сказать, он каким-то образом запускает эти выше 3 команды одновременно. Из-за этого все делается не по порядку (моя локальная база данных завершена сбрасыванием и переносом до того, как задание zip # 1 на самом деле завершено).

Неужели кто-то сталкивается с таким странным сценарием? Как самое простое исправление, есть ли способ заставить скрипт работать синхронно? Может быть, добавить какую-то команду, чтобы дождаться завершения предыдущей строки, прежде чем двигаться дальше?

EDIT Я добавил примерную версию моего сценария резервного копирования. Кажется, что вторая строка моего скрипта работает в то же время, что и первая строка моего скрипта, поэтому, пока команда SSH была выпущена, она еще не завершилась до того, как мои триггеры второй строки и начнется SQL-дамп.

#!/bin/bash 

THEDIR="sample" 
THEDBNAME="mydatabase" 

ssh -i /rsync/mirror-rsync-key [email protected] "tar zcvpf /$THEDIR/old-1.tar /$THEDIR/public_html/*" 

mysqldump --opt -Q $THEDBNAME > mySampleDb 

/usr/bin/rsync -avz --delete --exclude=**/stats --exclude=**/error -e "ssh -i /rsync/mirror-rsync-key" /$THEDIR/public_html/ [email protected]:/$THEDIR/public_html/ 

/usr/bin/rsync -avz --delete --exclude=**/stats --exclude=**/error -e "ssh -i /rsync/mirror-rsync-key" /$THEDIR/ [email protected]:/$THEDIR/ 
+3

Выполняйте эти три строки сценария, каждый из которых имеет амперсанд, &? Можете ли вы включить точный сценарий в свой вопрос вместе с записью cron? –

+1

Не могли бы вы поделиться своим сценарием. –

+0

@ jwpat7 Я отредактировал сообщение, чтобы добавить свой пример сценария – Mark

ответ

1

Если вы не явно, используя (& фоновый) все должно работать один за одним, не дожидаясь, пока предыдущие отделки. Возможно, вы на самом деле видите перекрытие предыдущих исполнений cron? Если это так, вы можете предотвратить многократное выполнение, вызвав свой скрипт с помощью стаи

например. запись полночь хрон из

0 0 * * * backup.sh

в

0 0 * * * стекаются -n /tmp/backup.lock -c backup.sh

+0

Спасибо, я не думаю, что они перекрываются, поскольку задание cron работает один раз в день, и он занимает 1 час всего, чтобы выполнить задание. – Mark

0

Если вы хотите запускать команды в последовательном порядке, вы можете использовать ; оператора.

; - оператор с запятой

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

Выполнять команды ls, pwd, whoami в одной строке последовательно один за другим.

ls;pwd;whoami 

Пожалуйста, исправьте меня, если я правильно не понимаю ваш вопрос.

+2

Точка с запятой позволяет только несколько отдельных команд на одной строке. Это не изменяет выполнение сценария или разделение с помощью новой строки – EkriirkE

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