Cron не работает должным образом при запуске

Спасибо за чтение.

Я создал скрипт bash для резервного копирования моих баз данных. Сценарий создаст каталог для дня, а затем создаст файл резервной копии для каждой базы данных в этом каталоге.

Он работает, как и ожидалось, если я позвоню из командной строки.

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

При запуске задания cron он создает каталог, но не создает файлы.

Я проверил системный журнал и вижу, как обрабатывается задание cron, но нет вывода, указывающего на ошибку. Появляется сообщение о том, что электронное письмо было бы отправлено, если бы был установлен постфикс или что-то подобное. Я не хочу устанавливать postfix, если только мне это не нужно.

Есть ли другой журнал, на который я мог бы посмотреть?

Вот задание cron (оно запускается от имени root):

@reboot /usr/bin/db.backup.sh

вот сценарий bash:

#!/bin/bash

DB_BACKUP="/files/database_backups/`date +%Y-%m-%d`"
DB_USER="root"
DB_PASSWD="a"
HN=`hostname | awk -F. '{print $1}'`

# Create the backup directory
mkdir -p $DB_BACKUP

# Remove backups older than 10 days
find /files/database_backups/ -maxdepth 1 -type d -mtime +10 -exec rm -rf {} \;

# Backup each database on the system
for db in $(mysql --user=$DB_USER --password=$DB_PASSWD -e 'show databases' -s --skip-column-names|grep -viE '(staging|performance_schema|information_schema)');
do mysqldump --max-allowed-packet=1073741824 --user=$DB_USER --password=$DB_PASSWD --events --opt --single-transaction $db | gzip > "$DB_BACKUP/$db-$(date +%Y-%m-%d).sql.gz";
chown -R www-data:www-data $DB_BACKUP
done
4
задан 30 July 2014 в 16:24

1 ответ

Сценарии, выполненные под кроном, не имеют той же среды как тогда, когда Вы выполняете его из командной строки.

Это может быть то, потому что ПУТЬ, определенный под кроном, не включает каталог, где mysql и mysqldump расположены.

Или Вы используете полный путь при ссылке на эти команды в сценарии, как /usr/bin/mysql, или Вы создаете новую переменную ПУТИ в начале своего сценария:

export PATH=/bin:/usr/bin

Или указывающий на любой другой каталог, где mysql и mysqldump установлены, если Вы не устанавливали MySQL с помощью пакета Ubuntu по умолчанию.

Для хранения возможных сообщений об ошибках, которые были бы произведены, когда сценарий выполняется от крона, если Вы не получаете почту локально, можно просто добавить перенаправление вывода к crontab определению как это:

@reboot /usr/bin/db.backup.sh >/tmp/db-backup.log 2>&1

Любое сообщение, информация и ошибка, будет позже найдено в /tmp/db-backup.log.

Рассматривают использование'>>' вместо'>' в вышеупомянутой строке, если Вы хотите добавить информацию и не перезаписать файл журнала при каждом выполнении.

Обновление: если задание крона выполняется, прежде чем сервер MySQL

, Если сценарий выполняется в процессе запуска машины, прежде чем сервер MySQL возрастет, можно реализовать маленькую проверку в начале сценария для ожидания файла сокета MySQL для присутствования:

while [ ! -e /var/run/mysqld/mysqld.sock]; do
  # if the file doesn't exist, will loop
do

Внимание : если MySQL никогда не подойдет по некоторым причинам, сценарий циклично выполнится навсегда.

2
ответ дан 30 July 2014 в 16:24

Другие вопросы по тегам:

Похожие вопросы: