Usando a data / hora do sistema em um script Cron

34

Estou configurando um Cronjob que fará backup de um banco de dados MySQL que tenho em meu servidor, mas não quero que ele continue substituindo o mesmo arquivo repetidas vezes. Em vez disso, quero ter uma matriz de backups para escolher, feita 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 que eu possa usar a data e / ou hora do sistema como algum tipo de variável no meu Cronjob? Se não, quais são suas sugestões para realizar o mesmo?

    
por AeroCross 04.03.2011 / 18:57

5 respostas

43

Você poderia tentar algo assim (como notas de Glenn Jackmann abaixo, você tem que escapar todos os caracteres % ):

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

Para ver se o seu cron em particular executará o comando crontab como um script em si, ou se você precisa escrever um script que calcule a data como uma string, e então execute o comando mysqldump.

Sem escapar do % , o "cron" no Redhat Enterprise Linux 5.0 (eu acho) continuou me dando erros sobre não encontrar um ) correspondente. Isso ocorre porque tudo após um % sem escape é enviado para a entrada padrão do comando.

Eu também usaria a recomendação para usar o formato de data ISO8601 (aaaa-mm-dd, que é %F ) para fazer com que os nomes dos arquivos sejam ordenados por data, quando classificados de forma lexical.

    
por 04.03.2011 / 19:17
7

Você deve ser capaz de usar date .
Digite info date ou man date para detalhes.

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

yourcommand > filepathandnameprefix$(date +"\%d-\%m-\%Y").extension
    
por 04.03.2011 / 19:11
4

In order to have such a command running appropriately we will have to escape % and then it will run as expected.

Veja: link

    
por 04.04.2012 / 11:21
0

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 parecem:

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

Aponte o trabalho cron para isso para ser executado todas as noites ou o que você preferir.

    
por 04.03.2011 / 20:50
0

Escreva um pequeno script wrapper que utilize o comando date 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
    
por 07.01.2012 / 19:36