rsync作为cron作业执行时不排除扩展名

时间:2015-02-19 14:42:34

标签: ubuntu cron crontab rsync

我试图使用rsync来备份我服务器上的所有文件和目录,而不是所有的东西,我想排除一些事情,所以我这样做:

/usr/bin/rsync -aAXh  --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /* /mnt/backupdirectory

它运作良好,完全按照它应该做的,直到我把它放在一个cron工作中每天都这样做。

30 23 * * * ~/scripts/backup_system.sh > ~/scripts/logs/backup_system.log 2>&1

当作为cron作业执行时,它不会排除它应该排除的所有目录。我不明白为什么。无法向某人解释为什么?

我认为这不重要,但使用的系统是Ubuntu Server 14.04。


下面的答案中指出了这个问题。在cron中使用大括号无效,我不得不用以下命令替换上一个命令:

/usr/bin/rsync -aAXh --exclude=/dev/* --exclude=/proc/* --exclude=/sys/* --exclude=/tmp/* --exclude=/run/* --exclude=/mnt/* --exclude=/media/* --exclude=/lost+found /* /mnt/backupdirectory

2 个答案:

答案 0 :(得分:2)

检查三件事:

  1. 来自cron的邮件中的错误是什么?
  2. 请勿使用波浪扩展。使用完整路径名称。
  3. 您的脚本是否设置了PATH?因为cronjobs不会继承任何PATH
  4. 最后一点是所有cron惊喜的99%。 使用像

    这样的东西
    PATH=$(/usr/bin/getconf PATH)
    

    在脚本的开头。要在命令行上对其进行测试,请使用空的环境运行它,例如

    /usr/bin/env -i /path/to/script.sh
    

    只要这不起作用,cronjob就不会。

答案 1 :(得分:0)

由于crontab使用sh作为默认shell,因此不支持大括号扩展 因此--exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"}无效

您可以添加

SHELL = / bin / bash

在您的crontab作业之上。

例如

SHELL=/bin/bash
1 1 * * * cp /test/{*txt,*sh} /tmp/