дождитесь завершения сценария оболочки, прежде чем перейти к следующей строке с Cron - PullRequest
0 голосов
/ 13 декабря 2011

--- файл makebackup.sh

#!/bin/bash
mysqldump --all-databases | gzip -9 > /backup/temp_db.gz
tar -Pcf /backup/temp_ftp.tar /public_html/
tar -Pcf /backup/temp_backup.tar /home/temp_db.gz /backup/temp_ftp.tar
wait %%
/backup/upload.sh

--- файл upload.sh

#!/usr/bin/expect -f

# connect via scp
spawn scp /backup/temp_backup.tar root@mybackup.com:/home/backup.tar
#######################
expect {
-re ".*es.*o.*" {
exp_send "yes\r"
exp_continue
}
-re ".*sword.*" {
exp_send "mypassword\r"
}
}
interact

Когда я смотрю на папку /backup, я вижу, что все файлы там. В правильном размере Когда я смотрю на целевой сайт, я вижу файл, который в 18 раз меньше, чем у меня на исходном сервере в папке /backup.

Когда я просто запускаю его как ./makebackup.sh, он работает правильно, когда я запускаю через cron, он не работает. Есть ли способ выполнить backup/upload.sh ONLY после завершения предыдущих команд?

15 12 * * 1,3,5 /backup/makebackup.sh 2>&1 >> /var/log/cron_makebackup.log

Cron log ничего не говорит, кроме как когда я запускаю его вручную.

1 Ответ

1 голос
/ 13 декабря 2011

Я не знаю, что делает wait %%, но это должно помочь:

#!/bin/bash
mysqldump --all-databases | gzip -9 > /backup/temp_db.gz
tar -Pcf /backup/temp_ftp.tar /public_html/
tar -Pcf /backup/temp_backup.tar /home/temp_db.gz /backup/temp_ftp.tar && \  
/backup/upload.sh || \
/backup/upload.sh

ПРИМЕЧАНИЕ : никогда не забывайте, что вы можете настроить scpssh тоже) для работы без паролей ! Я бы посчитал это вместо expect (это отличный инструмент).

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

Дополнительная информация:

  • Если вы напишите test && command, command будет выполняться только в случае успешного прохождения теста.
  • Если вы напишите test || command, command будет выполняться только в случае неудачного теста.

Запустите эти тесты:

$ true && echo "Yes."
Yes.
$ false || echo "Yes."
Yes.

Обратите внимание, что результаты полностью соответствуют интуиции о таких логических сравнениях, и все хорошо, пока вы не думаете о том факте, что true равно 0. :) Вот еще одна схема, обычно встречающаяся в программировании сценариев оболочки и интерактивных сессиях:

$ command1 && command2 && command3 && command4

Эта строка кода не будет запускать следующую команду в последовательности, если предыдущая команда не вернула "true", что означает отсутствие ошибок. Это способ избежать запуска команды, если требуемый предыдущий результат отсутствует.

Также см. эту статью о && и || тестировании.

НТН

...