rdiff备份bash脚本和cron的麻烦

我有这个非常简单的bash脚本:

#!/opt/bin/bash /opt/bin/rdiff-backup --force --print-statistics myhost::/var/bkp /volume1/backups/sql 2>&1 > /var/log/rdiff-backup.log; /opt/bin/rdiff-backup --force --print-statistics myhost::/var/www/vhosts /volume1/backups/vhosts 2>&1 >> /var/log/rdiff-backup.log; /opt/bin/rdiff-backup --force --print-statistics myhost::/etc /volume1/backups/etc 2>&1 >> /var/log/rdiff-backup.log; /opt/bin/rdiff-backup --force --print-statistics /volume1/homes /volume1/backups/homes 2>&1 >> /var/log/rdiff-backup.log; cat /var/log/rdiff-backup.log | /opt/bin/nail -s "rdiff-backup log" me@email.com; 

如果我从命令行运行脚本,以这种方式:

 nohup /path/to/my/scipt.sh & 

它工作正常,将每个rdiff-backup统计报告附加到rdiff-backup.log并将该文件发送到我的电子邮件地址,如预期的那样。 但是,如果我把脚本放在crontab中,那么脚本只能通过电子邮件发送一个rdiff备份作业。 我无法理解,因为脚本不能以相同的方式工作…

任何想法?

这是我的cronjob条目:

 30 19 * * * /opt/bin/bash /volume1/backups/backup.sh 

通过crontab只有最后一个工作是正确执行的,我想是因为这是唯一的一个本地备份。 当我从命令行执行脚本时,我使用root用户,而root用户的公钥位于远程机器的/root/./ssh/authorized_keys中。 crontab文件的所有者也是root用户,我使用root帐户通过“crontab -e”创build它们。

首先你需要确保在cron中使用的脚本不输出任何内容,否则:

  1. cron会认为有错误
  2. 如果有的话,你不会看到错误

这个解决方案是使用

 30 19 * * * /opt/bin/bash /volume1/backups/backup.sh 2>&1 >> /var/log/rdiff-backup-cron.log; 

其次,通过cron执行时看起来你正在失去env变量,试着将env设置添加到脚本中

 #!/opt/bin/bash . /root/.profile /opt/bin/rdiff-backup --force --print-statistics myhost::/var/bkp /volume1/backups/sql 2>&1 > /var/log/rdiff-backup.log 

如果/root/.profile不存在,请尝试添加. /root/.bashrc . /root/.bashrc/etc/profile

我希望这有帮助。