我不确定这里发生了什么事情:
我有一个在根目录下运行正常的备份脚本。 它会在适当的目录下生成一个> 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