Hoy os voy a hablar de una herramienta que he descubierto hace poco, que es la utilidad cron, presente en casi todos los sistemas unix, como por ejemplo los servidores linux a los que tienes acceso vía SSH.
¿Qué es cron?
Cron es un programa que se ejecuta residente en el sistema y que realiza diversas acciones con los intervalos que nosotros expresemos, con lo cual, lo podríamos usar, por ejemplo, para que todos los días a las 12 hiciera un zip con nuestras prácticas y nos lo pusiera en el escritorio o lo guardara en un disco duro externo (por ejemplo :P)
En este ejemplo, lo que voy a hacer es configurar el cron para que cada 5 minutos haga un backup de una base de datos MySQL (concretamente una instalación wordpress), la comprima y me la envíe por e-mail (esto no es recomendable para el uso general, ya que puede provocar sobrecarga, pero para un par de pruebas es bastante visual).
1. Configurando el archivo de cron vía ssh.
Lo primero que necesitamos es una terminal con acceso ssh al servidor que queremos automatizar, si tenemos acceso físico, se siguen los mismos pasos.
Una vez iniciada la sesión en el servidor remoto, veamos los comandos que podemos usar, que serán dos, fundamentalmente
crontab -l
crontab -e
El primero lista los trabajos que tiene nuestro usuario asignado, mientras que el segundo nos permite editar el achivo utilizando vi.
Para editar el archivo, usamos el comando anteriormente señalado y se nos mostrará una ventana de vim, vacía, pulsamos i para entrar en modo insertar, y una vez dentro escribimos en la primera línea
*/5 * * * * myscript.sh
Los asteriscos tienen su significado, son 5:
- El primero mide minutos (0-59)
- El segundo mide horas (0-23)
- El tercero mide días del mes (1-31)
- El cuarto mide meses del año (1-12)
- El quinto mide días de la semana (1 =lunes, 6 = sabado, 0 ó 7 = domingo )
Una cosa más, si lo que queremos es que se ejecute, cada 5 min, cada 6 horas, o algo así, ponemos un / antes del valor.
Un ejemplo de programa que quisieramos ejecutar todos los lunes a las 12:45 sería así:
45 12 * * 1 myscript.sh
Importante los asteriscos se conservan, porque significa, en cualquier momento, es decir, un asterisco en el día significa cualquier día, dentro de las restricciones.
2. Configurando nuestro script de backup
Como veis, la tarea que hemos asignado al cron es ejecutar un archivo sh para que haga las tareas que queremos, a continuación os pongo un ejemplo del archivo que he usado yo:
#dando valores iniciales
DBNAME=nombre
DBPASS=password
DBUSER=root
EMAIL="e@mail.com"
#volcamos el contenido de la base de datos
/path/to/mysqldump --opt -u $DBUSER -p$DBPASS $DBNAME >> backup.sql
#comprimimos el archivo
gzip backup.sql
#lo renombramos para incluir la fecha
DATE=`date +%Y%m%d` ; mv backup.sql.gz $DBNAME-backup-$DATE.sql.gz
#lo enviamos por e-mail
echo 'Backup del sitio web' | mutt -a $DBNAME-backup-$DATE.sql.gz $EMAIL -s "Backup del sitio web"
#borramos el archivo de los servidores
rm $DBNAME-backup-$DATE.sql.gz
Y con esto bastaría, solamente un par de anotaciones:
- Es importante tener cuidado con las rutas en el archivo cron.
- Si el comando devuelve un archivo vacío (0 bytes), es que el path de mysqldump es erróneo, aseguraos que lo poneis correctamente.
- destacar que el sistema, cuando ejecuta un cron, no obtiene los valores del PATH del usuario de la shell, sino que tiene los del sistema, de ahí que haya que poner la ruta completa.
Espero que os sea de utilidad:
Para más información
cron (Unix) Wikipedia
WordPress Backup with Cron Tamba2.org.uk