我正在设置一个 Cronjob 来备份服务器中的 MySQL 数据库,但我不希望它一遍又一遍地覆盖同一个文件。相反,我希望有一系列备份可供选择,自动完成。例如:
## Cronjob, run May 21st, 2011:
mysqldump -u username -ppasword database > /path/to/file/21-03-2011.sql
## SAME Conjob, run May 28th, 2011:
mysqldump -u username -ppasword database > /path/to/file/28-03-2011.sql
等等。
有什么方法可以在我的 Cronjob 中使用系统日期和/或时间作为某种变量吗?如果没有,您有什么建议来实现同样的目标?
答案1
你可以尝试这样的事情(正如下面格伦·杰克曼所说,你必须转义所有%
字符):
15 11 * * * touch "/tmp/$(date +\%d-\%m-\%Y).sql"
查看您的特定 cron 是否会在 crontab 中将命令作为脚本运行,或者您是否需要编写一个脚本来将日期计算为字符串,然后运行 mysqldump 命令。
在没有转义 的情况下%
,Redhat Enterprise Linux 5.0 上的“cron”(我认为)一直给我关于找不到匹配的错误)
。这是因为未转义之后的所有内容%
都会发送到命令的标准输入。
我还建议使用 ISO8601 日期格式(yyyy-mm-dd,即%F
)使文件名按词法排序时按日期排序。
答案2
您应该能够使用date
.
输入info date
或man date
了解详细信息。
类似下面的内容可能适合您(根据您的需要更改日期格式)
yourcommand > filepathandnameprefix$(date +"\%d-\%m-\%Y").extension
答案3
为了让这样的命令正确运行,我们必须逃脱 %然后它将按预期运行。
看:http://www.ducea.com/2008/11/12/using-the-character-in-crontab-entries/
答案4
date
编写一个使用该命令并调用备份命令的小包装脚本。
#!/bin/bash
NOW=`/bin/date +"%m%d%Y-%H%M%S"`
if [[ "$?" != "0" ]]; then
NOW="UNKNOWN_DATE"
fi
mysqldump -u username -ppassword database > /path/to/file/$NOW.sql
if [[ "$?" != "0" ]]; then
echo "$0: backup failed with error code $?"
fi