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

rsync does not exclude extension when executed as a cron job

我正在尝试使用 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

检查三件事:

  1. 来自 cron 的邮件中的错误是什么?
  2. 不要使用波浪号扩展。使用完整路径名。
  3. 您的脚本是否设置了 PATH?因为 cronjobs 不继承任何 PATH.

最后一点导致 99% 的 cron 意外。 使用像

这样的东西
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/