Cron作业无法备份Postgres数据库

我不确定这里发生了什么事情:

我有一个在根目录下运行正常的备份脚本。 它会在适当的目录下生成一个> 300kb的数据库转储。

当使用完全相同的命令将其作为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的完整path – 默认情况下,cron运行的脚本具有非常严格的PATH

假设:

我假设postgress数据库的凭据存储在~/.pgpass文件的权限设置为0600 ,并且您正在使用PG*环境variables。

原因:

从terminal运行的时候,你的备份命令工作的原因(创build数据库的备份),而从crontab运行的时候是不工作的(创build空文件)是环境。

原因:

当你在crontab中运行一个命令时(甚至当你强制执行它作为一个所需的用户时(例如, su - root -c 'my_aesome_command' ),被请求用户的环境variables与环境variables不同,loginterminal。

解:

我通过在加载我的备份脚本(实际上是因为我正在使用docker而加载我的容器时)执行此命令env >> /etc/environment来将特定用户的环境variables添加到/etc/environment