Programar tareas en Ubuntu con Cron

Una de las herramientas que sin lugar a dudas todo administrador de sistemas Linux debe controlar a la perfección es Cron. Pero incluso si no somos administradores de sistemas, si trabajamos sobre máquinas corriendo con Linux tarde o temprano llegará el día en el que necesitemos programar la ejecución de una tarea con cierta periodicidad, y entonces deberemos hacer uso de Cron (o alguna IDE que trabaje sobre Cron).

Programar tareas en Linux con Cron

A pesar de que Cron tiene un funcionamiento bastante sencillo y está bien documentado en internet, no he querido dejar pasar la oportunidad de aportar mi granito de arena al tema, y aprovechando que estoy preparando una entrada que requiere de la ejecución programada de una tarea he escrito estas líneas.

Además, aunque es más que probable que si ya tienes cierta experiencia con sistemas operativos Linux esta entrada no te desvele nada nuevo (o si, quien sabe), seguro que a más de un lector con menos experiencia en este ámbito le resulta de interés.

Cron

Cron es un demonio concebido para ejecutar tareas previamente programadas de forma periódica.

Y por demonio entendemos un programa que se ejecuta en segundo plano, que carece de interface para interactuar con él y que por norma general se inicia en el arranque del sistema, es el equivalente en Linux de los servicios en Windows.

Y como cualquier demonio o servicio en Linux podemos arrancarlo, pararlo, reiniciarlo o comprobar su estado con el comando service:

sudo service cron start
sudo service cron stop
sudo service cron restart
sudo service cron status

Crontab

Crontab es el nombre que se le da a los archivos dónde definimos las tareas programadas y la frecuencia con la que se ejecutarán. El nombre de crontab proviene de las palabras cron table.

Existe un archivo crontab «principal» /etc/crontab, que será gestionado por el administrador del equipo, pero además cada usuario del sistema tiene el suyo propio archivo.

Estructura de ficheros crontab

Los ficheros crontab son simples ficheros de texto dónde especificaremos una tarea por línea, y la estructura de cada línea es la siguiente:

# ┌───────────── minutos
# |
# │ ┌───────────── horas
# | |
# │ │ ┌───────────── día del mes
# | | |
# │ │ │ ┌───────────── mes
# | | | |
# │ │ │ │ ┌───────────── día de la semana
# │ │ │ │ │
# │ │ │ │ │
  * * * * * comando

Como puedes apreciar, en cada línea hay cinco campos reservados a definir la periodicidad, y uno más para hacer lo propio con el comando a ejecutar, todos ellos separados por espacios. Todos los campos deben ser rellenados obligatoriamente. Los rangos de valores posibles para cada campo son:

  • Campo minutos: 0 – 59
  • Campo horas: 0 – 23
  • Campo día del mes: 0 – 31
  • Campo mes: 1 – 12
  • Campo día de la semana: 0 – 6, dónde 0 es domingo y 6 sábado.

Caracteres especiales en crontab

Para definir la periodicidad de la tarea, podemos ayudarnos de algunos «modificadores» que nos permitirán ampliar enormemente las posibilidades:

CombinaciónSignificadoEjemplo
*Todos los valores*
,Listado de valores2,5,9
Rango de valores5-9
/Cada*/5
rango/excep.Excepto0-23/2

Otro carácter imprescindible es la almohadilla (#), que lo utilizaremos al comienzo de una línea para indicar que es un comentario.

Ejemplos de tareas programadas

Para disipar cualquier duda que podamos tener con respecto de los ficheros crontab, lo más sencillo es que veamos algunos ejemplos:

# Diariamente a las 02:00 am, ejecutamos el script definido
* 2 * * * service /home/user/script.sh

# Cada lunes a las 02:00 am, reiniciamos Apache
* 2 * * 1 service apache2 restart

# Cada 5 minutos, monitoreamos el estado de nuestra web
*/5 * * * * /home/user/checkSiteStatus.sh

# Cada hora, limpiamos la cache
0 * * * * * /home/user/cleanCache.sh

# De lunes a viernes a las 14:00, enviamos un e-mail
0 14 * * 1-5 /home/user/mail.sh

# los días 5,15 y 25 del mes a las 00:00, enviamos un informe
0 0 5,15,25 * * /home/user/sendReport.sh

Como ves, este sistema es realmente sencillo y versátil, ofreciéndonos muchas opciones para programar la ejecución de nuestras tareas. Si aún así tienes dudas, puedes realizar tus pruebas en la web Crontab Guru, una herramienta on-line muy útil.

Administrar las tareas programadas en Cron

Ahora que ya tenemos claros los fundamentos, vamos a ver como realizar las tareas más habituales.

Agregar una nueva tarea

Ya hemos explicado que para programar una tarea debemos incluirla en el archivo crontab, y para ello utilizaremos nuestro editor preferido:

sudo vim /etc/crontab

Pero además del archivo principal de crontab, cada usuario tiene el suyo propio, de forma que podemos programar tareas sin ser administrador del equipo. Para editar este archivo utilizaremos la orden:

crontab -e

Y si tenemos los permisos necesarios, poder editar el archivo crontab de otros usuarios ayudándonos del modificador -u seguido del nombre de usuario:

crontab -e -u usuario

Así que ahora solo quedaría agregar las tareas que nos interesen siguiendo las indicaciones que ya hemos visto. Aprovecho para hacer referencia al artículo Comandos en Vim por si quéreis echarle un vistazo,

Ver las tareas programadas

En este punto podemos hacer uso de alguno de los múltiples comandos que nos ofrece Linux para visualizar archivos como puede ser el comando more:

more /etc/crontab

O en caso de querer ver el archivo crontab de un usuario lo haremos con la orden crontab -l, utilizando o no el modificador -u en función de nuestras necesidades:

crontab -l
crontab -u usuario -l

Resetear el archivo crontab

Esta opción bien podría haberla omitido por lo delicada, pero ahí la dejo:

crontab -r

Ojo que no pide confirmación.

Logs en Cron

Los logs de Cron se almacenan en el archivo /var/log/syslog, pero este archivo contiene otros logs además de los que nos interesan. Si queremos ver exclusivamente los losg de cron podemos lanzar el siguiente comando:

grep CRON /var/log/syslog

La información que recibiremos no es muy detallada, pero en caso de tener alguna duda es buen buen lugar para comenzar a investigar.

Créditos y referencias

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *