Usando a data / hora do sistema em um Script Cron

37

Estou configurando um Cronjob que fará backup do banco de dados MySQL que eu tenho no meu servidor, mas não quero que ele sobrescreva o mesmo arquivo repetidamente. Em vez disso, quero ter uma variedade de backups para escolher, feitos automaticamente. Por exemplo:

## 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

E assim por diante.

Existe alguma maneira de usar a data e / ou hora do sistema como algum tipo de variável no meu Cronjob? Caso contrário, quais são suas sugestões para realizar o mesmo?

AeroCross
fonte

Respostas:

45

Você pode tentar algo assim (como Glenn Jackmann observa abaixo, você precisa escapar de todos os %personagens):

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

Para ver se o seu cron específico executará o comando a partir do crontab como um script por si só, ou se você precisará escrever um script que calcule a data como uma string e, em seguida, execute o comando mysqldump.

Sem escapar do %, "cron" no Redhat Enterprise Linux 5.0 (eu acho) continuava me dando erros por não encontrar uma correspondência ). Isso ocorre porque tudo depois de um sem escape %é enviado para a entrada padrão do comando.

Eu também aceitaria a recomendação de usar o formato de data ISO8601 (aaaa-mm-dd, que é %F) para ordenar os nomes dos arquivos por data, quando ordenados lexicamente.

Bruce Ediger
fonte
23
Tem que ter cuidado com datedentro de um cronfile: alguns crons (todos?) Tratam %como o fim do comando. (então $()o problema não era esse). Você tem que escapar de todas sinais de porcentagem: ... touch "/tmp/$(date +\%Y-\%m-\%d)"(mais agradável de usar um formato de data que tipos lexicographically)
Glenn Jackman
2
glenn jackman está correto: escapar dos caracteres '%' na entrada crontab acima funciona. Uma entrada do crontab do RHEL 5.0 é semelhante a: 50 11 * * * toque em "/tmp/backup.$(date + \% Y - \% m - \% d) .sql"
Bruce Ediger
Vale ressaltar que o uso de um subshell não funciona em uma variável de ambiente. Portanto, o DATE=$( date -I )uso ${DATE}posterior resulta no uso de um literal $( date -I )na linha de comando do trabalho.
Christopher Schultz
1
Parece que também %é necessário escapar do OpenSuse 42.
kgadek
7

Você deve poder usar date.
Digite info dateou man datepara obter detalhes.

Algo como o seguinte pode ser adequado para você (altere o formato da data de acordo com suas necessidades)

yourcommand > filepathandnameprefix$(date +"\%d-\%m-\%Y").extension
asoundmove
fonte
Novamente, tenha cuidado para escapar de todos os %caracteres dentro do cron.
Glenn Jackman
@glenn: Opa, com certeza. Quanto à ordem lexicográfica, eu apenas correspondi ao formato da data do OP. Eu pessoalmente gosto do formato ISO, como você.
asoundmove
1

Aqui está o script bash que eu usei:

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

Os arquivos são parecidos com:

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

Aponte o trabalho cron para que ele seja executado todas as noites ou o que você preferir.


fonte
Isso funciona como um encanto. Embora eu não entenda bem o que está acontecendo aqui. Os backticks permitem a inclusão da saída de outros programas ou algo assim? E a formatação (como +% F e tal)?
AeroCross
1
Sim, os backticks executam a substituição do comando em que a saída é substituída pelo próprio comando. Consulte a Seção 3.4.5 Aqui está uma lista mais abrangente de modificadores para os dados de ligação
Uau, isso é um recurso incrível. É ótimo sempre continuar aprendendo. Muito obrigado pelo link!
AeroCross
0

Escreva um pequeno script de wrapper que utilize o datecomando e chame seu comando de backup.

#!/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
LawrenceC
fonte