Я не уверен, что здесь происходит:
У меня есть сценарий резервного копирования, который отлично работает под root. Он создает дамп базы данных размером> 300 КБ в нужном каталоге.
Однако при запуске его как задания cron с точно такой же командой появляется пустой файл gzip, в котором ничего нет.
Журнал cron не показывает ошибок, просто команда была запущена.
Это сценарий:
#! /bin/bash
DIR="/opt/backup"
YMD=$(date "+%Y-%m-%d")
su -c "pg_dump -U postgres mydatabasename | gzip -6 > "$DIR/database_backup.$YMD.gz" " postgres
# delete backup files older than 60 days
OLD=$(find $DIR -type d -mtime +60)
if [ -n "$OLD" ] ; then
echo deleting old backup files: $OLD
echo $OLD | xargs rm -rfv
fi
При изменении на:
pg_dump -U postgres mydatabasename | gzip -6 > "$DIR/database_backup.$YMD.gz"
То же самое происходит.
И работа cron:
01 10 * * * root sh /opt/daily_backup_script.sh
Он создает файл database_backup, просто пустой. Кто-нибудь знает, что здесь происходит?
редактировать:
Хорошо, упрощено до этого, но он все еще не работает через cron
#! /bin/bash
DIR="/opt/backup"
YMD=$(date "+%Y-%m-%d")
pg_dumpall -U postgres > "$DIR/database_backup.$YMD"
И
01 10 * * * root /opt/daily_backup_script.sh
Вам нужно указать полный путь к pg_dump
- cron запускает свои скрипты с очень ограниченными PATH
по умолчанию.
Я предполагаю, что ваши учетные данные для базы данных postgress хранятся в ~/.pgpass
и права доступа к файлу установлены на 0600
и что вы используете PG*
переменные среды.
Причина, по которой ваша команда резервного копирования работает (создает резервную копию базы данных) при запуске с терминала и не работает (создает пустой файл) при запуске из crontab, - это среда.
Когда вы запускаете команду в crontab (даже если вы принудительно выполняете ее от имени желаемого пользователя (например, su - root -c 'my_aesome_command'
) переменные среды для запрошенного пользователя отличаются от переменных среды, поскольку они устанавливаются, когда пользователь входит в терминал.
Я исправил эту проблему, добавив переменные среды конкретного пользователя в /etc/environment
файл, выполнив эту команду env >> /etc/environment
когда я загружаю свой сценарий резервного копирования (фактически, когда я загружаю свой контейнер, так как я работаю с докером)