Utiliza Cron y Crontab para programar tareas en tu servidor

¿Alguna vez has intentado programar una tarea repetitiva en tu servidor Linux y no has sabido cómo hacerlo? Las herramientas cron y crontab que están disponibles de forma predeterminada en sistemas Linux te permitirán realizar una determinada tarea (o varias) en un determinado tiempo, y es que vamos a ser capaz de programar con una exactitud de minutos qué queremos ejecutar y cuándo lo queremos ejecutar. Hoy en RedesZone os vamos a explicar en detalle cómo funciona tanto Cron como Crontab, para que administres correctamente tus servidores.

Estos dos elementos son muy importantes a la hora de programar tareas periódicas y que se ejecuten sin que tengamos que estar pendientes de su estado. Nos va a permitir despreocuparnos de ejecutar algo en un determinado momento, dejándolo completamente automático en el sistema operativo. Hemos mencionado con anterioridad Cron y Crontab. En primer lugar, vamos a ver que diferencias existen entre ambos elementos. Posteriormente aprenderemos a agregar tareas, y para finalizar, nos adentraremos en la gestión de los jobs (trabajos) de Cron.

Diferencias entre Cron y Crontab

Aunque pueda parecer que estamos hablando de lo mismo, no es así, y se podrían considerar dos elementos dependientes uno del otro. Para ser más claros, son los encargados de que la programación de tareas en sistemas Linux sea posible. Actualmente cualquier sistema operativo basado en Linux dispone de ambas herramientas, con el objetivo de programar las diferentes tareas de forma repetitiva sin que nosotros nos tengamos que encargar de ello.

Qué es Cron

Cron es un demonio (proceso en segundo plano) que se ejecuta desde el mismo instante en el que arranca el sistema operativo. Cron se encargará de comprobar si existe alguna tarea (job) para ser ejecutada, de acuerdo a la hora configurada en el propio sistema operativo. Es muy importante que la hora esté bien configurada, y también la zona horaria, de lo contrario, las ejecuciones que realice Cron no se corresponderán con nuestras configuraciones.

Para garantizar que nuestro sistema operativo esté configurado correctamente, es muy importante que obtenga la hora automáticamente de los servidores NTP (Network Time Protocol) que existen. Para comprobar que tenemos la hora correcta en nuestro sistema operativo, en qué zona horaria estamos y si el reloj del sistema está correctamente sincronizado con los servidores NTP, podemos ejecutar la siguiente orden:

timedatectl

Deberíamos ver algo como lo siguiente:

Tal y como se puede ver, todas las horas cuadran perfectamente y el tiempo es el correcto, esto es muy importante, de lo contrario, los «Cron» se ejecutarán en horas donde no deberían ejecutarse. En el caso de que no tengamos la zona horaria bien configurada, podremos configurarla de forma correcta con la siguiente orden:

timedatectl set-timezone Europe/Madrid

Con la instalación del sistema operativo Linux, se configuran de forma automática los servidores NTP que nosotros queramos, en caso de fallo o que queramos cambiar estos servidores NTP, podremos hacerlo instalando el correspondiente servicio y configurándolo en /etc/ntp.conf.

En función de la distribución, Cron se inicia utilizando las carpetas /etc/rc.d/ o /etc/init.d y cada minuto comprueba los ficheros /etc/crontab/var/spool/cron en busca de posibles ejecuciones que hayamos programado.

Qué es Crontab

Crontab es un archivo de texto, se trata de un archivo con un contenido especial y específicamente diseñado para que sea leído correctamente por Cron y proceder con la ejecución que nosotros hayamos programado. Crontab posee una lista con todos los scripts a ejecutar, generalmente cada usuario del sistema posee su propio fichero Crontab, de esta forma, cada usuario podría programar sus propias tareas repetitivas independientemente, sin necesidad de que siempre tengamos que acudir al usuario administrador. De esta forma, cualquier usuario (incluyendo los administradores) podrán programar tareas repetitivas para realizar diferentes ejecuciones.

Para generar el archivo propio, cada usuario deberá hacer uso del comando «crontab» (sí, es el mismo nombre).

Agregar tareas a Crontab

Partiendo de que podemos ejecutar tareas, en primer lugar, vamos a configurar un script muy sencillo que llamaremos consulta.sh, pondremos en nuestro «Escritorio» o en «Documentos» este script, podremos ejecutar directamente el editor de texto «nano» en la ubicación donde queramos ponerlo:

nano consulta.sh

El contenido del script sería el siguiente:

#!/bin/bash

#script de ejemplo

sudo ls -l / > archivoResultado.txt

Una vez que hayamos programado el script, que básicamente es un programa que lista los archivos y directorios del directorio actual, y lo exporta a un archivo de texto, tenemos que darle permisos de ejecución para poder ejecutarlo correctamente por parte de Cron, de lo contrario no tendrá permisos de ejecución:

chmod ugo+x consulta.sh

Este aspecto es muy importante, ya que de lo contrario el comando nunca será ejecutado.

Ha llegado el momento de editar el fichero que posee las tareas. Para ello nos vamos a ayudar del comando crontab -e. Nos encontramos la siguiente estructura:

linux-cron-crontab-anadir-tareas-periodicas

5 asteriscos y el comando a ejecutar. Cada uno de los 5 asteriscos significa:

  • m: minuto
  • h: hora
  • dom: día de la semana
  • mon: mes
  • dow: día del mes

Lo valores que pueden adoptar cada una de estas variables se encuentran en la imagen. Por ejemplo, en el caso del último, se permite la utilización del nombre de los días escritos en inglés. Aunque en la imagen anterior no aparezca, es necesario indicar entre el comando y el último asterisco (el día) el propietario del archivo.

Para que quede todo claro, vamos a utilizar algunos ejemplos:

Si queremos ejecutar el script de consulta.sh todos los días a las 7 de la tarde, tendremos que indicar una línea en el crontab con lo siguiente:

00 19 * * * usuario /ubicacion/del/script/consulta.sh

Si queremos ejecutar todos los domingos a las 7 de la tarde:

00 19 * * 0 usuario /ubicacion/del/script/consulta.sh

Ejecutar el script todos los 4 de febrero a las 7 de la tarde:

00 19 4 2 * usuario /ubicacion/del/script/consulta.sh

Hay que decir que en Linux existen algunas cadenas de texto reservadas para ejecutar procesos durante determinados periodos en el propio Crontab, esto nos será de mucha ayuda:

  • @reboot: Ejecuta una vez y nada más iniciarse el equipo.
  • @yearly: ejecuta sólo una vez al año: 0 0 1 1 *
  • @monthly: ejecuta una vez al mes y el primer día: 0 0 1 * *
  • @weekly: todas las semanas, el primer minuto de la primera hora de la semana: 0 0 * * 0.
  • @daily: todos los días a las 12 de la noche: 0 0 * * *
  • @midnight: Tiene el mismo efecto que el anterior.
  • @hourly: todas las horas durante su primer minuto: 0 * * * *

Aunque os hemos puesto cuál sería el formato, al hacer uso de crontab -e se pueden utilizar estos términos para definir el periodo.

Administración de los jobs del Cron

El funcionamiento de Crontab es muy sencillo, tal y como hemos podido ver, ahora os vamos a enseñar algunos comandos básicos para controlar el funcionamiento del propio Crontab en sistemas operativos Linux.

Para remplazar el archivo existente por otro que defina el usuario se debe utilizar el siguiente comando:

crontab archivo

Para editar el archivo existente en la actualidad se utiliza el comando que ya hemos visto a lo largo de este artículo:

crontab -e

Listar todas las tareas existentes en el crontab del usuario:

crontab -l

Borrar el crontab que está configurado:

crontab -d

Definir el directorio en el que se almacenará el archivo de crontab. Para realizar esta operación se deben tener permisos de ejecución en dicho directorio:

crontab -c dir

Instrucción para manejar el crontab de otros usuarios existentes en el sistema:

crontab -u usuario

Cómo podéis ver, programar la ejecución de tareas no es nada complicado y se puede realizar de forma rápida si se tiene claro todo lo mencionado en este tutorial.

¡Sé el primero en comentar!