У меня есть два задания cron на моем сервере AWS (запускается через crontab -e
) вызывать pg_dump
по конкретным базам данных.
Два сценария идентичны, за исключением целевой базы данных, для которой они создаются ($PG_SRC_DB
). Один терпит неудачу в pg_dump
команда, но не выводит ни ошибок, ни журналов:
PGPASSWORD=$PG_SRC_PASSWORD $PG_DUMP_PATH --no-owner $PG_SRC_DB -h $PG_SRC_HOST -p $PG_SRC_PORT -U $PG_SRC_USER > dump.sql
Я знаю это, потому что перенаправил все stderr и stdout в /tmp/cron.log
и я получаю сообщение об ошибке:
mv: cannot stat 'dump.sql': No such file or directory
Эта команда появляется после того, как я запустил pg_dump
и dump.sql
файл должен был быть создан, но не удается, потому что pg_dump
терпит неудачу
Я отлаживал несколько часов и сделал следующее:
export <PGVAR>
для PGPASSWORD
, PGUSER
, PGHOST
, и PGDATABASE
pg_dump
#!/bin/bash -l
оболочка входаpg_dump
ошибка в файле с ... > dump.sql 2> error.log
Оба сценария работают в терминале при запуске вручную. Я не знаю, как еще отладить pg_dump
команда, так как я не получаю от нее журналы.
Как правило, это происходит из-за того, что значения переменных среды для терминала и cronjobs различаются. Вы можете попробовать импортировать среду терминала в скрипт. Допустим, вы запускаете скрипт под пользователем root. Попробуйте добавить строку вверху скрипта.
#!/bin/bash
. /root/.profile
Я не совсем уверен, что произошло, но теперь это работает. Я сделал две вещи:
chmod +x pg_backup.sh
- Я уже сделал это, и скрипт работал в cron, так как я мог получить какой-то вывод в журналахdos2unix
в файле, чтобы преобразовать любой CR или CRLF в LF - я не уверен, как это решит проблему, так как я написал сценарий в Vim на Mac