Utilizzo della data / ora di sistema in uno Script Cron


37

Sto configurando un Cronjob che eseguirà il backup di un database MySQL che ho nel mio server, ma non voglio che continui a sovrascrivere lo stesso file più volte. Invece, voglio avere una serie di backup tra cui scegliere, eseguita automaticamente. Per esempio:

## 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 così via.

Esiste un modo in cui posso usare la data e / o l'ora del sistema come una sorta di variabile nel mio Cronjob? In caso contrario, quali sono i tuoi suggerimenti per ottenere lo stesso risultato?

Risposte:


45

Potresti provare qualcosa del genere (come osserva Glenn Jackmann di seguito, devi scappare da tutti i %personaggi):

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

Per vedere se il tuo cron particolare eseguirà il comando da crontab come script in sé e per sé, o se è necessario scrivere uno script che calcoli la data come una stringa e quindi esegua il comando mysqldump.

Senza scappare da %"cron" su Redhat Enterprise Linux 5.0 (penso) continuava a darmi errori nel non trovare una corrispondenza ). Questo perché tutto ciò che %viene inviato dopo un non escape viene inviato all'input standard del comando.

Vorrei anche prendere la raccomandazione di utilizzare il formato data ISO8601 (aaaa-mm-gg, che è %F) per rendere i nomi dei file ordinati per data quando ordinati in modo lessicale.


23
Bisogna stare attenti dateall'interno di un cronfile: alcuni croni (tutti?) Trattano %come la fine del comando. (quindi $()non era il problema). Devi sfuggire a tutti i segni di percentuale: ... touch "/tmp/$(date +\%Y-\%m-\%d)"(più bello usare un formato data che ordina lessicograficamente)
Glenn Jackman,

2
glenn jackman è corretto: l'escape dei caratteri '%' nella voce crontab sopra funziona. Una voce crontab di RHEL 5.0 è simile alla seguente: 50 11 * * * touch "/tmp/backup.$(data + \% Y - \% m - \% d) .sql"
Bruce Ediger

Vale la pena notare che l'utilizzo di una subshell non funziona in una variabile di ambiente. Quindi, DATE=$( date -I )e quindi l'utilizzo in ${DATE}seguito risulta nell'uso di un valore letterale $( date -I )nella riga di comando del lavoro.
Christopher Schultz,

1
Sembra che l'escape di %sia necessario anche su OpenSuse 42.
kgadek,

7

Dovresti essere in grado di usare date.
Digitare info dateo man dateper i dettagli.

Qualcosa di simile al seguente potrebbe adattarsi a te (cambia il formato della data in base alle tue esigenze)

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

Ancora una volta, fai attenzione a evitare tutti i %caratteri all'interno di cron.
Glenn Jackman,

@glenn: Oops, certo. Per quanto riguarda l'ordine lessicografico, ho appena abbinato il formato della data del PO. Personalmente mi piace il formato ISO, come te.
asoundmove


1

Ecco lo script bash che ho usato:

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

I file sembrano:

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

Punta il cron job su questo per eseguire ogni notte o qualunque cosa tu preferisca.


Funziona come un fascino. Anche se non capisco bene cosa stia succedendo qui. I backtick consentono l'inclusione dell'output di altri programmi o qualcosa del genere? Che dire della formattazione (come +% F e simili)?
AeroCross

1
Sì, i backtick eseguono la sostituzione dei comandi in cui l'output viene sostituito con il comando stesso. Fare riferimento alla Sezione 3.4.5 Ecco un elenco più completo di modificatori per il collegamento

Oh, wow, è una risorsa straordinaria. È bello continuare a imparare sempre. Grazie mille per il link!
AeroCross

0

Scrivi un piccolo script wrapper che utilizza il datecomando e chiama il tuo comando di 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.