我试图使用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
答案 0 :(得分:2)
检查三件事:
PATH
?因为cronjobs不会继承任何PATH
。最后一点是所有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/