Uso de la fecha / hora del sistema en un script Cron

37

Estoy configurando un Cronjob que respaldará una base de datos MySQL que tengo en mi servidor, pero no quiero que siga sobrescribiendo el mismo archivo una y otra vez. En cambio, quiero tener una variedad de copias de seguridad para elegir, hechas automáticamente. Por ejemplo:

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

Y así.

¿Hay alguna manera de que pueda usar la fecha y / o hora del sistema como algún tipo de variable en mi Cronjob? Si no, ¿cuáles son sus sugerencias para lograr lo mismo?

AeroCross
fuente

Respuestas:

45

Podría intentar algo como esto (como Glenn Jackmann señala a continuación, debe escapar de todos los %personajes):

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

Para ver si su cron particular ejecutará el comando fuera de crontab como un script en sí mismo, o si necesita escribir un script que calcule la fecha como una cadena, y luego ejecute su comando mysqldump.

Sin escapar del %"cron" en Redhat Enterprise Linux 5.0 (creo) seguía dándome errores sobre no encontrar una coincidencia ). Esto se debe a que todo después de un escape %se envía a la entrada estándar del comando.

También tomaría la recomendación de usar el formato de fecha ISO8601 (aaaa-mm-dd, que es %F) para hacer que los nombres de archivo se ordenen por fecha cuando se ordenen léxicamente.

Bruce Ediger
fuente
23
dateHay que tener cuidado con dentro de un cronfile: algunos crons (¿todos?) Se tratan %como el final del comando. (Así que $()no era el problema). Debe escapar de todos los signos de porcentaje: ... touch "/tmp/$(date +\%Y-\%m-\%d)"(es mejor usar un formato de fecha que se clasifique lexicográficamente)
Glenn Jackman
2
Glenn Jackman es correcto: escapar de los caracteres '%' en la entrada crontab anterior funciona. Una entrada de crontab RHEL 5.0 se ve así: 50 11 * * * toque "/tmp/backup.$(date + \% Y - \% m - \% d) .sql"
Bruce Ediger
Vale la pena señalar que el uso de una subshell no funciona en una variable de entorno. Entonces, DATE=$( date -I )y luego usarlo ${DATE}más tarde resulta en usar un literal $( date -I )en la línea de comando del trabajo.
Christopher Schultz el
1
Parece que también %es necesario escapar de OpenSuse 42.
kgadek
7

Deberías poder usar date.
Escriba info dateo man datepara más detalles.

Algo como lo siguiente podría ser adecuado para usted (cambie el formato de fecha según sus necesidades)

yourcommand > filepathandnameprefix$(date +"\%d-\%m-\%Y").extension
asoundmove
fuente
Nuevamente, tenga cuidado de escapar de todos los %caracteres dentro de cron.
Glenn Jackman
@glenn: Vaya, claro. En cuanto al orden lexicográfico, acabo de hacer coincidir el formato de fecha del OP. Personalmente me gusta el formato ISO, como tú.
asoundmove
1

Aquí está el script bash que utilicé:

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

Los archivos se ven así:

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

Apunte el trabajo cron a esto para que se ejecute todas las noches o lo que prefiera.


fuente
Esto funciona como un encanto. Aunque, no entiendo muy bien lo que está sucediendo aquí. ¿Los backticks permiten la inclusión de la salida de otros programas o algo así? ¿Qué pasa con el formato (como +% F y tal)?
AeroCross
1
Sí, los backticks realizan la sustitución de comandos donde la salida se sustituye por el comando en sí. Consulte la Sección 3.4.5. Aquí hay una lista más completa de modificadores para el enlace de
Oh, wow, ese es un recurso increíble. Es genial seguir aprendiendo siempre. ¡Muchas gracias por el vínculo!
AeroCross
0

Escriba un pequeño script de contenedor que utilice el datecomando y llame a su comando de copia de seguridad.

#!/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
fuente