Introducción a tareas programadas usando cron

Introducción a tareas programadas con cron

Las tareas programadas tienen usos muy comunes en la automatización de sistemas que requieren ejecutarse cada x tiempo sin intervención del usuario. Su función es agendar los procesos que deseas ejecutar en tu sistema. Existen diferentes programadores de tareas, en este artículo nos enfocaremos en tareas programadas usando cron.

Cron es un demonio utilizado para ejecutar tareas programadas como copias de seguridad, actualizaciones, envíos de notificaciones periódicas, etc. Esta basado en sistemas operativos tipo Unix (Linux, FreeBSD, Mac OS, etc.). A los procesos que se ejecutan por lapsos de tiempo se les conocen como cron jobs.

Crontab

Sus comandos están escritos en un archivo crontab. En linux, puedes encontrar ese archivo en /etc/crontab. Crontab verificará la fecha y hora en la que se ejecutara el script. Todo lo realizará en modo background. Podemos gestionar los crontabs de la siguiente manera:

crontab -l

Para editar

crontab -e

Borra el crontab del usuario

crontab -d

Entendiendo el formato de las crontabs

La tareas cron tienen una sintaxis que ayuda a definir en que intervalos de tiempo se ejecutarán los scripts. Su formato cuenta con 5 espacios seguidos del script a ejecutar.

¿Qué son los asteriscos?

En muchos ejemplos verás un asterisco (*) en lugar de un número. Esto representa todos los números posibles en esa posición. Por ejemplo un asterisco en la posición de hora, haría trabajar un script cada hora.

Ejemplos de configuración de algunas tareas programadas

Tareas cotidianas

Esta tarea se ejecutara cada minuto, todo el tiempo

* * * * * [comando]

Lo traducimos como:

  • Sobre cada minuto
  • Repetir cada hora
  • Todos los días del mes
  • En todos los meses
  • Funcionando todos los días de la semana

Todos los domingos la 1:15 el script realizará un respaldo de las BD de mis sistemas

15 1 * * 0 [comando]

Se traduce como:

  • A partir del minuto 15
  • Desde la 1 de la madrugada
  • Todos los dias del mes
  • En todos los meses
  • Sólo los domingos

Necesito hacer un respaldo el día 1 y el día 16 de cada mes a las 23 horas

0 23 1,16 * * /usr/tasks/backup.sh

Descrito como:

  • En el minuto 0
  • De las 11 de la noche
  • Del día 1 y 16 del mes
  • Para todos los días del mes
  • Puede ser cualquier día de la semana

Por intervalos de tiempo

Arranco un script entre días laborales de lunes a viernes para enviarles un correo a las 9 de la mañana a los clientes deudores del crédito del banco

0 9 * * 1-5 /usr/tasks/sent_notification.sh

Se traduce como:

  • Empezando en el minuto 0
  • Desde 9 de la mañana
  • Todos los días del mes
  • Sobre todos los meses
  • Lunes a Viernes

Necesito verificar cada 15 minutos, en horario de oficina, que clientes nos han estado pagando puntual para acumular sus puntos.

Solución 1. Por medio de listas separadas por comas (,):

0,15,30,45 9-5 * * * /usr/tasks/add_coupons.sh

Solución 2. Interpretado por la diagonal (/) para crear intervalos:

0/15 9-5 * * * /usr/tasks/add_coupons.sh

Caracteres especiales

Los caracteres especiales nos ayudan a crear comandos más elegantes:

  • * => Selecciona todos los valores de un campo.
  • – => Selecciona rango de valores (por ejemplo 1-6).
  • ,  => Selecciona valores específicos (por ejemplo 1,3,5 en el nivel de días de la semana, es decir los lunes, miércoles y viernes ).
  • /  => Selecciona incrementos a partir del primer valor (por ejemplo 0/15 que es cada 15 minutos comenzando desde el minuto 0 -> 15, 30 ,45).

Palabras reservadas de cron

Cron al igual que otros lenguajes de programación también maneja palabras reservadas para facilitar su eso. Esto debido a que no necesariamente necesitamos ejecutar en tiempos demasiado específicos:

  • @reboot Ejecuta cada vez que se inicia el servidor
  • @yearly/@annually Se ejecuta una vez al año equivalente a 0 0 1 1 *
  • @monthly Se ejecuta una vez al mes equivalente a 0 0 1 * *
  • @weekly En el primer minuto de la primer hora de la semana equivalente a 0 0 * * 0.
  • @daily/@midnight diario, a las 12:00A.M equivalente a 0 0 * * *
  • @hourly al primer minuto de cada hora equivalente a 0 * * * *

Por ejemplo. Necesito verificar quienes no han pagado sus deudas pendientes y realizar el cargo al final del día.

@daily /usr/tasks/payments.sh

También podemos ejecutar scripts de diferentes lenguajes directamente. En este caso verifico quienes aún no terminaron de registrarse en mi red social para enviarles una invitación. Hago la validación cada hora.

@hourly /usr/bin/ruby /home/task/email/finish_registration.rb

Mi aprendizaje al respecto

Cómo verás, hay un sin fin de formas de sacarles provecho a las tareas programadas. Mis recomendaciones como desarrollador:

  • Evalúa correctamente el tiempo que necesitas para correr un script. Tener un script corriendo cada hora, cuando se necesita conocer la cantidad de deudores al final del día, no es recomendable. Si bien es cierto que funcionará, consumes recursos innecesarios.
  • Las tareas programadas se corren en modo background, por lo tanto el usuario no interactúa con el sistema y no puede ver algún tipo de error. No esta demás hacer un script de pruebas para validar que todo este funcionando correctamente.

Una herramienta estupenda que funciona como demo, es el sitio de Crontab Guru donde puedes probar todo tipo de configuraciones antes de usarlo en tus scripts de producción.

Sitio web de Crontab Guru
Sitio web de Crontab Guru

Puedes ver una aplicación, en el siguiente proyecto: Web Scraping automático para hoteles.

Espero te haya servido este artículo. Si te fue útil, te agradecería que nos ayudes a compartirlo. Quedamos atentos a tus comentarios que ayude a enriquecer este tema. Estaré entusiasmado de poder interactuar contigo.