2

我有这个非常简单的 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-backup 作业,通过电子邮件发送统计信息。我无法理解,因为脚本不能以相同的方式工作......

任何想法?

这是我的 cronjob 条目:

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

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

4

1 回答 1

1

首先,您需要确保 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/etc/profile

我希望这有帮助。

于 2013-03-25T14:47:11.680 回答