Cron jobs: una Guía Completa

15min

Dentro de la administración de sistemas o el mantenimiento de aplicaciones es muchas veces necesario ejecutar tareas que deben ser realizadas según una programación concreta. En Linux esto se puede conseguir de una manera muy sencilla por medio de los cron jobs.

Índice

¿Qué es un cron job?

Un cron job no es más que una tarea programada en un sistema Linux. Esto quiere decir, un trabajo, comando o script que se debe ejecutar automáticamente atendiendo a una programación totalmente configurable.

Los cron jobs no son exclusivos de sistemas Linux, en realidad los puedes usar en muchos otros sistemas Unix-like como MacOS.

Mediante los cron jobs podemos automatizar acciones que deben efectuarse de manera  repetitiva. Existen multitud de ejemplos prácticos comunes, que veremos más adelante en este post, como copias de seguridad, envío de reportes, etc.

¿Cómo funciona el sistema cron job en Linux?

Los mecanismos de configuración de los trabajos programados con cron son muy sencillos en realidad. Vamos a ver cómo funciona, aclarando también algunos conceptos básicos que debes conocer.

El demonio cron (crond) y su ciclo de ejecución

En el core de un sistema Linux tenemos un demonio llamado crond que es, básicamente, un proceso que corre en segundo plano de forma continuada. Ese demonio se encarga de revisar los archivos de configuración llamados crontabs en busca de tareas programadas que deben ser ejecutadas en un momento dado.

Cada minuto, crond comprueba si alguna instrucción coincide con la hora y fecha actuales del sistema, para ejecutarla si es necesario.

Archivos crontab: estructura y ubicación

Los archivos crontab son los que almacenan el listado de jobs, junto con la definición de los instantes en los que se deben ejecutar. Existen dos tipos principales en un sistema:

  • Por una parte tenemos el crontab del sistema: ubicado en /etc/crontab y en directorios como /etc/cron.d/, que está gestionado por el administrador.
  • Por otra parte tenemos los crontab del usuario, siendo que cada uno puede tener su propio archivo de trabajos configurados. Estas tareas se ejecutan en principio sin privilegios de superusuario.

Para poder definir los cron jobs para un usuario usamos el comando siguiente:

crontab -e

Esto nos abrirá el archivo de los cron jobs en un editor de texto usable por terminal. Los trabajos se tienen que definir en una sintaxis que veremos un poco más adelante.

Usuarios, permisos y jerarquía de ejecución

El sistema Cron respeta el usuario al que pertenece cada job. Esto quiere decir que cada uno de los trabajos se ejecuta con los permisos del usuario propietario del crontab.

Además, existen archivos como /etc/cron.allow y /etc/cron.deny para restringir quién puede usar este servicio, de modo que podemos configurar las posibilidades de uso de estas tareas programadas a nivel de servidor.

Sintaxis de los cron jobs

Una vez estamos definiendo los cron jobs para el usuario, tenemos que escribir cada uno de los trabajos en una línea aparte, con una sintaxis específica que vamos a explicar.

Estructura básica de una línea cron

Vamos a ver la sintaxis de una línea de cron job. Su esquema tiene la siguiente forma:

* * * * * comando-a-ejecutar

Cada uno de los asteriscos corresponde con una configuración temporal. Luego se define el comando en particular que se debe ejecutar, que puede ser un comando común del sistema operativo, o bien un script que automatice alguna tarea más compleja.

Por el orden de aparición de los asteriscos, corresponden a cada uno de los siguientes parámetros temporales:

  • Minuto (0 – 59).
  • Hora (0 – 23).
  • Día del mes (1 – 31).
  • Mes (1 – 12).
  • Día de la semana (0 – 7).

En la siguiente imagen tienes una guía más visual:

Caracteres especiales (\*, \*/, -, ,) y su significado

A la hora de definir los momentos de ejecución existen algunos caracteres especiales que debemos conocer:

  • El asterisco «*» indica cualquier valor posible.
  • Luego podemos especificar «cada n unidades de tiempo» con un valor «*/n». Con él podrías definir la ejecución cada «n». Por ejemplo: */5 en los minutos sería cada 5 minutos.
  • Podemos usar un guión para definir un rango de valores, por ejemplo, 1-5 en el día de la semana sería equivalente a decir «de lunes a viernes».
  • También podemos utilizar una coma para listar un número indeterminado de valores específicos. Por ejemplo si decimos 1,15 en día del mes estaríamos indicando los días 1 y 15 del mes.

Ejemplos de cron jobs reales y prácticos

Lo mejor para poder entender la sintaxis de los cron jobs es mostrar algunos ejemplos típicos. Los siguientes ejemplos prácticos serían casos reales de uso de las tareas del cron.

0 2 * * * /home/user/backup.sh

El comando anterior serviría para ejecutar un script llamado backup.sh cada día a las 2 de la mañana.

0 * * * * rm -rf /tmp/*

Esta segunda programación indicaría que se tienen que limpiar archivos temporales (borrando lo que hay en la carpeta /tmp), cada hora.


El comando anterior lo usarías para actualizar paquetes de un servidor Ubuntu, o cualquier otro basado en Debian, todos los domingos a las 4 de la mañana

Ventajas de los cron jobs

Vamos a ver ahora algunos motivos por los que son realmente importantes y necesarios los cron jobs.

Automatización eficiente de tareas repetitivas

Si tenemos alguna tarea que debe ejecutarse de manera regular es importante que la programemos en un cron job. Esto nos libera de tener que ejecutarla manualmente, evitando posibles olvidos o tareas tediosas.

Bajo consumo de recursos del sistema

Aunque pueda parecer que tener tareas programadas requiere consumir muchos recursos del sistema, el demonio crond en realidad consume recursos despreciables, por lo que resulta muy eficiente guardar las tareas programadas en cron jobs.

Fácil configuración sin necesidad de interfaces gráficas

Una vez aprendes a definir los trabajos programados resulta bastante sencillo añadir nuevas tareas o modificar las que hubiese anteriormente. No hace falta aprenderse la tabla de significados de cada una de las claves temporales, ya que una rápida consulta nos puede refrescar la memoria.

Además, la definición de estas tareas se realiza por medio del terminal, sin necesidad de interfaces gráficas, algo fundamental cuando estamos administrando servidores.

Muy útil para mantener sistemas actualizados y seguros

Las tareas programadas en cron jobs se pueden utilizar para cualquier cosa que necesitemos, pero resultan especialmente útiles para mantener sistemas actualizados, algo esencial para garantizarla seguridad del sistema y los paquetes instalados.

Compatible con todos los sistemas Linux y Unix-like

Como hemos dicho antes, los cron jobs están disponibles en cualquier sistema operativo que esté construido como Unix, por lo que son compatibles con sistemas Linux o MacOS, entre otros.

Usos comunes de cron jobs en sistemas Linux y servidores

En los siguientes puntos vamos a ver casos de uso típicos, útiles para hacerte una idea de las posibilidades más clásicas de los cron jobs.

Realizar copias de seguridad automáticas

Las copias de seguridad realizadas de manera diaria, semanal o mensual generalmente se añaden en tareas programadas dentro de cron jobs. Esto hace que se ejecuten sin falta y sin necesidad de intervención manual.

Ejecutar scripts de mantenimiento o limpieza de archivos

Para asegurarnos que los servidores estén siempre al día se pueden utilizar cron jobs que realicen tareas de mantenimiento como borrar archivos temporales, limpiar registros antiguos o rotar logs.

También es muy útil añadir tareas de actualización de paquetes, para asegurarnos de tener siempre las versiones más modernas, que deberían tener menos errores de seguridad.

Enviar correos o reportes periódicos

Es posible configurar cron para que envíe informes automáticos por correo electrónico, ya sea con resultados de scripts, métricas de rendimiento o notificaciones de estado del sistema.

Sincronización de datos o servidores

Cuando tienes que trabajar en entornos distribuidos es muy habitual que tengas que sincronizar datos entre máquinas. De este modo puedes ejecutar el copiado de ficheros con comandos como rsync, que se podrían ejecutar diariamente o por intervalos más cortos.

Reiniciar servicios o aplicaciones en horarios definidos

También podríamos utilizar tareas programadas para realizar reinicios periódicos sobre servicios que se ejecutan en una máquina. Esto podría venir bien para liberar memoria o aligerar procesos, lo que reduce las posibilidades de que surjan bloqueos.

Diferencia entre cron job, at y systemd timers

Existen diversas herramientas que nos pueden servir para hacer cosas similares. En los siguientes puntos vamos a ver sus diferencias para que sepas dónde y cuándo usarlas.

¿Qué distingue a cron de at en cuanto a programación de tareas?

Se usa cron para ejecutar tareas repetitivas programadas en intervalos regulares de tiempo. Por su parte, at permite programar una tarea única para ejecutarse en un momento específico.

La clave está en que cron es recurrente mientras que at se usar para cosas puntuales.

Ventajas de systemd timers frente a cron en sistemas modernos

Si necesitas características más avanzadas de las que ofrecen los cron jobs te recomendamos consultar las posibilidades de los systemd timers. Algunas características avanzadas que nos ofrecen como extra los systemd timers son estas:

  • Integración nativa con el demonio systemd.
  • Posibilidad de ejecutar tareas según condiciones del sistema (por ejemplo, al arrancar o al conectar la red).
  • Retrasos y tolerancia a fallos más flexibles, así como mejor integración con los log.

¿Cuál usar según el tipo de tarea y frecuencia requerida?

En resumen, las alternativas que tenemos se pueden usar en estos casos:

  • cron es perfecto para tareas repetitivas simples ya que es compatible con cualquier sistema. Además son fáciles de configurar.
  • at se usa para una tarea puntual.
  • Ya por último, puedes usar systemd timers cuando trabajas en sistemas modernos y necesitas mayor control y supervisión de procesos, pero generalmente no se usan tanto ya que requieren mayores conocimientos de configuración.

Cómo crear, editar y eliminar cron jobs

Aunque ya hemos adelantado algunos detalles sobre la creación de los trabajos programados vamos a detallar ahora los pasos necesarios para administrar estas tareas.

Crear un cron job con el comando crontab -e

Para comenzar el trabajo del administración de los Cron Jobs debemos lanzar el comando siguiente:

crontab -e

Al realizar este comando se abre el archivo crontab del usuario en el editor de texto por defecto configurado en nuestro terminal.

En ese archivo de texto tienes las líneas, una por cada trabajo, con la sintaxis de cron que hemos explicado antes.

Editar tareas existentes desde el archivo crontab

El proceso para editar tareas existentes es exactamente el mismo que utilizamos para crearlas. Simplemente debemos ejecutar el comando «crontab -e» para luego cambiar los archivos de las líneas de trabajo que queramos modificar.

Por supuesto, podemos modificar tanto la sintaxis de la programación temporal como el propio comando a ejecutar.

Eliminar tareas programadas con crontab -r o limpiarlas individualmente

Para eliminar tareas programadas simplemente tendremos que abrir de nuevo el archivo y eliminar aquellas líneas que deseemos suprimir.

Otra posibilidad sería lanzar el comando «crontab -r» que borra todas las tareas programadas que tenga el usuario actualmente.

Uso del archivo /etc/crontab y cron.d para tareas del sistema

En el caso que seas un administrador de sistemas también puedes definir tareas programadas de manera global. Para ello tienes que editar los siguientes archivos:

  • /etc/crontab, es el archivo principal de cron del sistema.
  • /etc/cron.d/ es un directorio donde se colocan archivos adicionales con tareas específicas.

Revisar cron jobs activos por usuario

Si en cualquier momento necesitas saber qué tareas tienes en un momento dado configuradas puedes usar el comando:

crontab -l

Esto nos permitirá listar las tareas actuales de un usuario. Ahora bien, si necesitas verificar todos los cron jobs configurados en el sistema, tendrás que inspeccionar los directorios /etc/cron.* o el log de syslog.

Buenas prácticas para trabajar con Cron Jobs

A la hora de trabajar con tareas programadas como Cron Jobs es ideal tener en cuenta una serie de buenas prácticas:

Documenta tus tareas para facilitar el mantenimiento

Lo ideal es que documentes cuáles son las tareas que tienes programadas en tu servidor. Esto facilitará el mantenimiento del sistema por diversos motivos.

Primero para identificar qué hace cada una de las líneas del archivo Cron, pues con el paso del tiempo es fácil que se nos olvide el motivo de la configuración de alguna tarea en particular.

Además, es útil mantener esa documentación para poder realizar el despliegue de aplicaciones en otros servidores cuando necesitemos hacer una migración.

Redirecciona la salida estándar y de errores a logs

Los trabajos programados almacenan la salida de los comandos de manera predeterminada, pero no siempre tendrás acceso a los logs del sistema. Es por ello que se podría redireccionar la salida hacia algún medio que sí podamos abrir, que nos permita supervisar el funcionamiento de las tareas programadas.

Por ejemplo, podemos enviar la salida a un archivo de log en una ruta distinta:

0 2 * * * /home/user/backup.sh >> /var/log/backup.log 2>

Usa rutas absolutas en tus scripts y comandos

Los cron jobs pueden interpretar incorrectamente las rutas a los archivos definidos de manera relativa. Es por ello que se recomienda definir siempre las rutas en los comandos programados de manera absoluta.

Al mismo tiempo, si ejecutas un script mediante un cron job, lo ideal es que también utilices rutas absolutas en ellos.

Programa las tareas fuera de las horas pico de uso

Ten cuidado con tareas que requieran una elevada capacidad de procesamiento o uso de disco para poder ejecutarse. En caso de tener tareas pesadas debes programarlas de manera prioritaria en los horarios donde el servidor tenga una menor carga de trabajo.

Por ejemplo, si haces un backup de los sitios web de un servidor y las bases de datos sería ideal ejecutarlo en la madrugada, para que el trabajo no afecte a la experiencia de los usuarios que visitan esos sitios web.

Valida el funcionamiento de los scripts manualmente antes de programarlos

Por supuesto, antes de poner un script en un cron job, deberías ejecutarlo manualmente para que sepas con certeza que funcionará de manera esperada.

Herramientas para gestionar y visualizar cron jobs

Los cron jobs se pueden gestionar desde el terminal, pero existen también otras herramientas que vamos a mencionar.

Visualizar tareas con crontab -l y cat /etc/crontab

Como hemos dicho, puedes visualizar de manera predeterminada las tareas programadas en el editor de texto de tu terminal, al abrir el archivo de trabajos con crontab -e.

De todos modos, si solo necesitas visualizar los trabajos programados por el usuario actual puedes ejecutar también crontab -l.

Además, si lo que deseas es visualizar las tareas globales del sistema tendrás que ver el contenido del archivo /etc/crontab, con este comando:

cat /etc/crontab

Uso de cronitor para monitoreo avanzado

Además existen herramientas externas como Cronitor que pueden ayudarte de una manera más avanzada a monitorizar la marcha de tus cron jobs, notificando si una tarea falla o no se ejecuta.

Aplicaciones con interfaz gráfica como GNOME Schedule o Webmin

Además, si prefieres usar interfaz gráfica para conseguir planificar tus tareas puedes usar algunas herramientas extra como GNOME Schedule, que permite manejar los archivos de cron jobs de una manera sencilla.

Cuando no tengas interfaz gráfica en tu servidor, algo que es bastante habitual en servidores en producción, puedes aún así acudir a herramientas de interfaz web como Webmin, que permiten gestionar cron jobs de forma visual desde un panel de administración.

Logs del sistema: /var/log/syslog y /var/log/cron

Si quieres acompañar la salida y depurar posibles problemas puedes consultar los log del cron, donde se registra la actividad de las tareas programadas.

Según la distribución el lugar donde se puede consultar varía. En Ubuntu y otras distribuciones basadas en Debian lo puedes encontrar en /var/log/syslog. En CentOS y otras distros basadas en Red Hat lo encuentras en /var/log/cron.

Comprobar ejecución con tail, grep y otros comandos del sistema

Puedes usar algunos comandos para consultar el contenido de ese archivo. Un comando típico es tail, que nos permite ver la cola de los archivos de log, para ver las últimas líneas de contenido.

tail -n 50 /var/log/syslog

Eso nos mostraría las últimas 50 líneas del fichero.

También lo podemos ver en tiempo real con el comando siguiente:

tail -f /var/log/syslog

Eso mostraría las apariciones de las últimas líneas de cron a medida que se van registrando.

Otra posibilidad que puedes usar es combinarlo con grep, para filtrar y mostrar únicamente la actividad con el demonio cron:

tail -f /var/log/syslog | grep CRON

Ese comando muestra en tiempo real las entradas del log de sistema y usando Grep conseguimos que solo se muestren las que están relacionadas con cron.

Fernán García de Zúñiga

Productos relacionados: