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
检查三件事:
- 来自 cron 的邮件中的错误是什么?
- 不要使用波浪号扩展。使用完整路径名。
- 您的脚本是否设置了
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/
我正在尝试使用 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
检查三件事:
- 来自 cron 的邮件中的错误是什么?
- 不要使用波浪号扩展。使用完整路径名。
- 您的脚本是否设置了
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/