Ubuntu 当作为cron作业执行时,rsync不排除扩展

Ubuntu 当作为cron作业执行时,rsync不排除扩展,ubuntu,cron,crontab,rsync,Ubuntu,Cron,Crontab,Rsync,我正在尝试使用rsync备份服务器上的所有文件和目录,而不是所有文件和目录,我想排除一些内容,因此我会: /usr/bin/rsync -aAXh --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /* /mnt/backupdirectory 它工作得很好,并且完全按照它应该做的去做,直到我把它放到cron工作中,每天都这样做 30 23 * * * ~/s

我正在尝试使用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服务器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
检查三件事:

  • 来自cron的邮件中有什么错误
  • 不要使用平铺扩展。使用完整路径名
  • 您的脚本是否设置了路径?因为cronjobs不继承任何
    路径
  • 最后一点是所有cron惊喜的99%。 使用类似

    PATH=$(/usr/bin/getconf PATH)
    
    在脚本的开头。要在命令行上测试它,请在空环境下运行它,例如

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

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

    因为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/
    

    1.我不知道是否有来自cron的邮件,在日志中,在我不想备份的目录中有许多被拒绝权限的错误。手动执行命令时,我还遇到了另一个错误,因此我认为这与此无关。2.tilde仅在此处使用,我的crontab中没有tilde。3.其他cron作业工作正常,在我从cron调用的脚本中,我还对rsync输出进行了归档,归档作业工作正常。据我所见,cron作业很好,但是rsync命令没有正确执行。我将检查路径问题。经过测试,使用虚拟脚本,cron作业可以正常工作fine@Nicolas1)Cron将stdout或stderr上的所有输出发送给与crontab关联的用户。如果您的脚本生成输出,它将在该用户的邮件中。2) 您的非虚拟脚本是否设置了
    路径
    ?如果没有,那就是一个大问题。3) “{x,y,z}”语法是非标准shell语法。Cronjobs是由
    /bin/sh
    执行的(这可能是一个伪装的bash,但也可能是在POSIXLY_正确的模式下运行的,并且无法识别大括号扩展语法)。太棒了!使用大括号是它不能按预期工作的原因。非常感谢你的帮助,我今天学到了一些东西。