Introducción a Cron 2014-09-13

Tutorial de Cron para automatizar tareas y administrarlas con el comando crontab.

Este nanotutorial nos muestra como automatizar tareas a través del administrador de tareas programadas Cron.

Introducción a Cron

Cron es una utilidad que se activa cada minuto examinando todas las configuraciones de tareas (mejor conocidas como crontab) en búsqueda de aquellas programadas para ese minuto específico. Existe un crontab por usuario asi como uno global a nivel de sistema que se almacena en /etc/crontab.

Las tareas que podemos programar van a depender de los privilegios que tengamos con el usuario que la registra. De los ejemplos más prácticos podriamos mencionar: rutinas de backup, mantenimiento de registros en una base de datos, sincronización de información a través de un web service.

El demonio crond está incluido por defecto en cualquier instalación de GNU/Linux.

El comando crontab

Cron nos provee un comando para administar las tareas que es crontab. Entre las opciones disponibles con el comando crontab tenemos:

-l ó listar el crontab del usuario

crontab -l

-e ó editar el crontab del usuario

crontab -e

Cuando se trata de editar el crontab, en el caso de sistemas basados en Debian (Ubuntu, Mint), la primera vez suele preguntar el editor que deseas utilizar. En mi caso prefiero el nano. Si no conoces de este editor o quieres aprender más de el, te recomiendo el siguiente nanotutorial: Tutorial del Editor de Texto Nano.

Esto puedes también modificarlo definiendo una variable de entorno llamada EDITOR con tu editor favorito.

export EDITOR=vi

-r ó eliminar el crontab del usuario

crontab -r

Sintaxis del crontab

En la sintaxis del crontab tenemos seis componentes que podemos configurar:

  • Minutos.
  • Horas.
  • Día en el mes.
  • Mes.
  • Día en la semana.
  • Comando a ejecutar.

El formato es tabular, es decir separado por tabs.

*     *     *   *    *        comando a ejecutar
-     -     -   -    -
|     |     |   |    |
|     |     |   |    +----- día en la semana (0 - 6) (domingo=0)
|     |     |   +------- mes (1 - 12)
|     |     +--------- día en el mes (1 - 31)
|     +----------- hora (0 - 23)
+------------- minuto (0 - 59)

Basados en estos seis parámetros podemos definir reglas como:

  • Cada minuto.
  • Cada 30 minutos.
  • Diariamente a las 8 horas con 15 minutos.
  • El primer día del mes.
  • El primer día de Enero.
  • Todos los días Jueves a las 6 horas.

Cuando hablamos del comando a ejecutar, personalmente recomiendo utilizar un script bash. El registrar un comando complejo dentro de la sintaxis del crontab puede ser un poco dificil de administrar, recomiendo dejar toda la lógica a ejecutar reflejada en un script a parte.

Los comandos que podemos ejecutar van a depender de los privilegios como usuario que tengamos, esto incluye los permisos de escritura a directorios por ejemplo.

Configurando nuestra primera tarea cron en el crontab

Vamos a iniciar con una tarea sencilla, escribiremos un script bash que escriba la fecha en que es ejecutado a un archivo de texto. Para esto vamos a utilizar el editor nano.

nano automated.sh

El contenido del script será el siguiente:

#/bin/bash

date >> /tmp/automated.log

Configurando nuestra primera tarea cron en el crontab

Guardamos el scipt y asignamos permisos de ejecución con el siguiente comando:

chmod +x automated.sh

Configurando nuestra primera tarea cron en el crontab

Para ejecutar nuestro script y verificar que todo se esta ejecutando correctamente, lo hacemos de esta manera:

./automated.sh

Configurando nuestra primera tarea cron en el crontab

Para verificar que nuestro script se ejecuta correctamente podemos verificar el archivo log creado en /tmp/automated.log. Esto lo hacemos con el siguiente comando:

cat /tmp/automated.log

Configurando nuestra primera tarea cron en el crontab

Si vemos la fecha nos indica que todo funciona correctamente.

Ahora si, a editar nuestro crontab. Vamos a programar que nuestro script se ejecute cada minuto. Para editar el crontab vamos a ejecutar el siguiente comando:

crontab -e

Configurando nuestra primera tarea cron en el crontab

Nos trasladamos al final del archivo (luego de todas las lineas de comentarios) y escribimos lo siguiente:

* * * * * /home/gilmar/automated.sh

Configurando nuestra primera tarea cron en el crontab

En mi caso, esa es la ruta completa para llegar al script, para uds. puede ser diferente. El asterísco "*" significa que se ejecuta siempre, recuerden hablamos que cron se activa cada minuto.

Una vez hemos guardado el crontab, vamos a ver un mensaje de confirmación diciendo que nuestro crontab ha sido modificado e instalado.

Configurando nuestra primera tarea cron en el crontab

Basta entonces comprobar en nuestro archivo log que se esté acumulando la última fecha de ejecución del script.

cat /tmp/automated.log

Vamos a modificar nuevamente el crontab, en esta ocasión vamos a definir que el script se ejecutará cada 15 minutos.

crontab -e
*/15 * * * * /home/gilmar/automated.sh

Configurando nuestra primera tarea cron en el crontab

Si verificamos nuestro log, veremos que la fecha ahora en lugar de ir minuto tras minuto, se estará almacenando cada 15 minutos.

Ejemplos de otras configuraciones

A continuación se detallas otras configuraciones como ejemplos de lo que podemos programar en nuestro crontab.

0 8-12,14-20 * * * /home/gilmar/automated.sh -> cada hora exacta (minuto 0) de 8 a 12 y de las 14 a 20 horas
0 6 1 * * /home/gilmar/automated.sh -> el primer dia del mes a las 6 horas exactas
0 6,20  * * * /home/gilmar/automated.sh -> todos los dias a las 6 y 20 horas exactas
0 6 * 1 * /home/gilmar/automated.sh -> todos los dias durante enero a las 6 horas exactas
0 6 * * 1 /home/gilmar/automated.sh -> los dias lunes a las 6 horas exactas
*/30  * * * * /home/gilmar/automated.sh -> cada 30 minutos
0 */4 * * * /home/gilmar/automated.sh -> cada 4 horas en el minuto 0
* 6-8 * * * /home/gilmar/automated.sh -> cada minuto de las 6 horas a las 8 horas

Integración con lenguajes de programación y bases de datos

Bash no es la única solución para la ejecución de comandos, fácilmente podemos llamar script en otros lenguajes como PHP, Perl, Python, Ruby y más. Con esto puedes definir tareas de mantenimiento para tus aplicaciones.

Otro ejemplo de rutinas que puedes hacer es backups con los diferentes motores de bases de datos a través de los comandos mysqldump (MySQL) y pg_dump (PostgreSQL).


Acerca del autor

Hugo Gilmar Erazo Full Stack Web Developer

Soy un desarrollador web con más de 10 años de experiencia. Me considero fanático de GNU/Linux, lo cual me ha permitido complementar mis conocimientos en el desarrollo web con la administración de servidores.

Aunque manejo todo lo relacionado al Front-End, me inclino más por el desarrollo Back-End. También desarrollo aplicaciones móviles híbridas. Me gusta lo que hago.

Compartir este artículo