在Cron脚本中使用系统日期/时间


37

我正在设置一个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中的某种变量?如果没有,您对实现相同目标有什么建议?

Answers:


45

您可以尝试这样的操作(如下面的glenn jackmann所述,您必须转义所有%字符):

15 11 * * * touch "/tmp/$(date +\%d-\%m-\%Y).sql"

要查看您的特定cron是否会将命令作为脚本本身从crontab中运行出来,或者是否需要编写一个以字符串形式确定日期的脚本,然后运行mysqldump命令。

在不逃脱的情况下%,Redhat Enterprise Linux 5.0上的“ cron”(我认为)一直给我关于找不到匹配项的错误)。这是因为未转义后的所有内容都%发送到命令的标准输入。

我还建议使用ISO8601日期格式(yyyy-mm-dd,即%F),以词法对文件名进行按日期排序。


23
必须注意datecronfile的内部:某些crons(全部?)被%视为命令的结尾。(所以这$()不是问题)。您必须转义所有百分号:(不... touch "/tmp/$(date +\%Y-\%m-\%d)"希望使用按字典顺序排序的日期格式)
glenn jackman 2011年

2
glenn jackman是正确的:可以在上面的crontab条目中转义'%'字符。RHEL 5.0 crontab条目如下所示:50 11 * * *触摸“ /tmp/backup.$(date + \%Y-\%m-\%d).sql”
Bruce Ediger

值得注意的是,使用子shell在环境变量中不起作用。因此,DATE=$( date -I )然后再使用${DATE}以后,将$( date -I )在作业的命令行中使用文字。
Christopher Schultz

1
似乎%在OpenSuse 42上也必须转义。
kgadek '16

7

您应该能够使用date
键入info dateman date了解详细信息。

类似以下内容可能适合您(将日期格式更改为您的需要)

yourcommand > filepathandnameprefix$(date +"\%d-\%m-\%Y").extension

同样,请小心转义%cron中的所有字符。
格伦·杰克曼

@glenn:糟糕,当然。至于字典顺序,我只是匹配了OP的日期格式。我个人喜欢ISO格式,就像您一样。
asoundmove 2011年


1

这是我使用的bash脚本:

#!/bin/bash
mysqldump -u user1 -p DatabaseName | gzip > BackupFolder/backup`date +%F_%T`.sql.gz

文件如下:

backup2011-03-02_15:16:46.sql.gz

将Cron工作指向此位置,使其每晚或您喜欢的任何时间运行。


这就像一个魅力。虽然,我不太了解这里发生了什么。反引号是否允许包含其他程序的输出或其他内容?格式(如+%F等)如何?
AeroCross 2011年

1
是的,反引号执行命令替换,其中输出替换为命令本身。请参阅第3.4.5节。 这里是数据链接

哦,哇,这是一个了不起的资源。一直学习很高兴。非常感谢您的链接!
AeroCross 2011年

0

编写一个利用该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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.