¡No te pierdas las ofertas por tiempo limitado!

Cron job: una guía completa para principiantes

Cron job: una guía completa para principiantes

Una tarea cron o cron job es un programador basado en el tiempo en sistemas operativos tipo Unix, como Linux y macOS. Automatiza tareas repetitivas como las copias de seguridad, el mantenimiento del sistema y la ejecución de scripts.

Los usuarios definen una programación y un comando en un archivo crontab para mantener los procesos críticos en ejecución constante en segundo plano sin intervención manual.

Para utilizar cron con eficacia, es necesario conocer sus componentes básicos:

  • Sintaxis y operadores: cron utiliza cinco campos de tiempo (minuto, hora, día del mes, mes y día de la semana) y caracteres especiales, como asteriscos y barras oblicuas, para definir intervalos.
  • Configuración: los usuarios gestionan las programaciones con el comando crontab o colocando los scripts en directorios específicos del sistema.
  • Permisos: los archivos cron.allow y cron.deny controlan el acceso y ayudan a mantener la seguridad del sistema.
  • Aplicación práctica: los casos de uso más comunes incluyen la automatización de copias de seguridad de bases de datos, la limpieza de cachés del servidor y el envío de informes periódicos por correo electrónico.

¿Qué es un cron job?

Un cron job es una utilidad que permite a los usuarios de Linux y Unix ejecutar comandos o scripts automáticamente a una hora y fecha determinadas. En lugar de ejecutar un comando manualmente todos los días o semanas, se programa una vez y el sistema lo ejecuta en segundo plano a la hora establecida.

Esta automatización es importante para la gestión de servidores. Por ejemplo, un administrador de sistemas que gestiona un servidor privado virtual (VPS) no puede realizar copias de seguridad de las bases de datos manualmente todas las noches a las 3:00 AM.

Un cron job se encarga de esta tarea de forma fiable, mejorando la eficiencia y reduciendo los errores humanos.

Entre los casos de uso comunes de las tareas cron se incluyen

  • Mantenimiento del sistema: eliminación de archivos temporales, rotación de archivos de registro o limpieza de datos en caché para liberar espacio en disco.
  • Gestión de datos: volcado de bases de datos MySQL a una carpeta de copia de seguridad o sincronización de archivos entre servidores remotos.
  • Notificaciones: envío automático de resúmenes por correo electrónico, comprobación de actualizaciones del sistema o supervisión del uso del disco y alerta a los administradores cuando queda poco espacio.
  • Aplicaciones web: activación de scripts PHP para tareas como la distribución de boletines o la renovación de suscripciones.

¿Cómo funciona un cron job?

Un job cron se ejecuta a través del demonio cron (crond), un servicio en segundo plano que se ejecuta continuamente y ejecuta los comandos definidos en los archivos de cron table (crontab).

Cada minuto, el daemon comprueba los archivos de configuración y determina si hay alguna tarea programada para ejecutarse en ese momento.

Es importante distinguir entre los dos tipos de archivos de configuración:

  • Crontab del sistema: ubicado en /etc/crontab, este archivo gestiona las tareas de todo el sistema y sólo los usuarios root pueden editarlo. Incluye un campo adicional que especifica qué usuario ejecuta el comando.
  • Crontab de usuario: cada usuario tiene su propio archivo crontab. La ubicación varía según la distribución, como /var/spool/cron/crontabs/ en Debian y Ubuntu y /var/spool/cron/ en RHEL, CentOS y Fedora. Los usuarios editan estos archivos con el comando crontab -e y las tareas se ejecutan con los permisos de ese usuario.

Comprender la sintaxis y los operadores de crontab

La sintaxis de crontab define tareas programadas (cron jobs) utilizando una sola línea con cinco campos de hora y fecha seguidos del comando a ejecutar. Los operadores especiales añaden flexibilidad a la hora de definir intervalos de tiempo.

Este es el formato básico de una entrada crontab:

minuto hora día_del_mes mes día_de_la_semana comando_a_ejecutar

Los cinco campos de temporización (minuto, hora, fecha)

Los cinco campos de temporización definen cuándo se ejecuta una tarea cron. El sistema lee la programación en el siguiente orden:

CampoDescripciónValores permitidos
MinutoEl minuto de la hora en que se ejecuta el comando.0-59
HoraLa hora del día en formato de 24 horas.0-23
Día del mesLa fecha específica del mes.1-31
MesEl mes del año.1-12 o JAN-DEC
Día de la semanaEl día de la semana.0-6, donde domingo = 0 (o 7 en algunos sistemas)

¡Importante! Ten cuidado al programar trabajos a través de múltiples servidores en diferentes zonas horarias. Comprueba siempre la hora local de cada servidor con el comando date para confirmar que tu configuración es correcta.

Operadores Crontab

Los operadores Crontab te permiten definir intervalos y patrones complejos dentro de los campos de tiempo. Cronie y su predecesor, Vixie cron, admiten ocho operadores.

Estas implementaciones sirven como herramientas cron por defecto en la mayoría de las distribuciones de Linux, incluyendo Ubuntu, Debian, RHEL, CentOS y Fedora:

  • Asterisco (*): representa todos los valores posibles. Por ejemplo, un asterisco en el campo minuto significa que la tarea se ejecuta cada minuto.
  • Coma (,): especifica una lista de valores únicos. Por ejemplo, 1,5 en el campo día de la semana ejecuta la tarea los lunes y los viernes.
  • Guión (-): define un rango de valores. Por ejemplo, 6-9 en el campo mes ejecuta la tarea de junio a septiembre.
  • Barra oblicua (/): especifica valores escalonados o incrementos. Por ejemplo, */12 en el campo hora ejecuta el comando cada 12 horas.

Estos operadores no son compatibles con el cron estándar de Linux. Sólo funcionan en programadores basados en Java, como Quartz y Spring Boot, o en servicios en la nube como AWS EventBridge:

  • Último (L): especifica el último día del mes o el último día de la semana.
  • Día de la semana (W): busca el día de la semana (de lunes a viernes) más próximo a una fecha determinada.
  • Hash (#): especifica la enésima aparición de un día de la semana, como el segundo lunes del mes.
  • Signo de interrogación (?): indica que el día del mes o de la semana no importa.

Consejo profesional

La mayoría de las implementaciones de cron permiten combinar rangos con valores de paso. Por ejemplo, 1-20/2 ejecuta un trabajo cada dos minutos durante los primeros 20 minutos.

Ejemplos de cron jobs

Los siguientes ejemplos muestran cómo aplicar la sintaxis de crontab a tareas del mundo real.

Sintaxis de cronPropósitoExplicación
0 0 * * 0 /root/backup.shCopia de seguridad semanalEjecuta el script de copia de seguridad cada domingo a medianoche.
0 * * * 1 /root/clearcache.shMantenimiento del servidorLimpia la caché cada hora, pero sólo los lunes.
0 6,18 * * * /root/db-dump.shInstantánea de la base de datosVuelca la base de datos dos veces al día, a las 6 de la mañana y a las 6 de la tarde.
*/10 * * * * /scripts/monitor.shMonitorización del tiempo de actividadEjecuta un script de monitorización cada 10 minutos.
0 0 1,15 * * /scripts/payroll.phpTarea bimensualEjecuta un script de nómina los días 1 y 15 de cada mes a medianoche.
30 2 * * * /usr/bin/apt updateActualización del sistemaComprueba las actualizaciones de paquetes diariamente a las 2:30 AM, que suele ser una hora de poco tráfico.
* * * /scripts/s1.sh; /scripts/s2.shTareas múltiplesEjecuta varios comandos en una sola tarea cron separándolos con un punto y coma.
0 8 1-7 * * [ “$(fecha ‘+\%u’)” = “1” ] && /scripts/report.shInforme mensualGenera un informe a las 8 AM los días 1-7 del mes, pero sólo ejecuta el script cuando es lunes.

¿Qué son las cadenas especiales de los cron jobs?

Las cadenas especiales son atajos que comienzan con @ y reemplazan la sintaxis de cinco campos. Mejoran la legibilidad de las programaciones comunes y reducen el riesgo de errores de sintaxis.

  • @reboot: ejecuta el comando una vez cuando se inicia el demonio cron.
  • @hourly: se ejecuta una vez por hora (equivalente a 0 * * * *).
  • @daily (o @midnight): se ejecuta una vez al día a medianoche (equivalente a 0 0 * * *).
  • @weekly: se ejecuta una vez a la semana, el domingo a medianoche (equivalente a 0 0 * * 0).
  • @monthly: se ejecuta una vez al mes, el día 1 a medianoche (equivalente a 0 0 1 * *).
  • @yearly (o @annually): se ejecuta una vez al año, el 1 de enero (equivalente a 0 0 1 1 *).

Estos son algunos ejemplos de tareas cron que utilizan cadenas especiales:

@daily /home/user/scripts/daily-cleanup.sh
@reboot /usr/local/bin/start-my-app.sh
@hourly /var/www/html/monitor.php

¡Importante! La directiva @reboot se ejecuta cuando se inicia el daemon cron, no necesariamente cuando se inicia el sistema. Si detienes y reinicias el servicio cron sin reiniciar el sistema, las tareas @reboot vuelven a ejecutarse.

Permisos de cron

Los administradores del sistema controlan quién puede programar un cronjob mediante dos archivos en el directorio /etc/: cron.allow y cron.deny.

  • cron.allow: si existe este archivo, sólo los usuarios que figuran en él pueden crear, editar o ejecutar trabajos cron. El sistema bloquea a todos los demás usuarios.
  • cron.deny: si cron.allow no existe, el sistema comprueba este archivo en su lugar. Los usuarios enumerados aquí no pueden utilizar cron, mientras que todos los demás usuarios sí pueden.

Si no existe ninguno de los dos archivos, el comportamiento predeterminado depende de la distribución:

  • Debian y Ubuntu: todos los usuarios pueden utilizar cron por defecto.
  • RHEL, CentOS y Fedora: sólo root puede utilizar cron por defecto.

Consulta siempre la documentación de tu distribución o prueba el acceso a cron con un usuario no root.

Por ejemplo, para permitir que sólo un administrador de base de datos (dbadmin) programe tareas, crea un archivo cron.allow y añade dbadmin al mismo. Esta configuración impide que otros usuarios ejecuten tareas en segundo plano no autorizadas que consumen recursos del sistema.

Cómo configurar un cron job

Para configurar una tarea cron, abre el terminal de tu máquina, confirma que cron está instalado, crea o edita un archivo crontab con crontab -e y observa las tareas programadas con crontab -l.

Algunos trabajos pueden requerir privilegios elevados o de root, o puede que necesites colocar scripts en directorios del sistema para tareas recurrentes.

1. Accede al terminal o SSH

Para gestionar las tareas cron, accede a la línea de comandos de tu servidor. Si utilizas un servidor remoto o VPS, conéctate a través de SSH con un cliente como PuTTY en Windows o Terminal en macOS o Linux.

Alternativamente, los usuarios del VPS de Hostinger pueden utilizar la función de terminal del navegador disponible en el panel de control VPS de hPanel.

Vista del VPS en hPanel

2. Instala cron

La mayoría de las distribuciones de Linux incluyen cron por defecto. Para confirmar que está instalado y en ejecución, comprueba el estado del servicio:

systemctl status cron
Estado del servicio cron en terminal

Si falta el servicio, instálalo con tu gestor de paquetes.

  • Para Ubuntu y Debian
sudo apt update
sudo apt install cron
  • Para RHEL, CentOS y Fedora:
sudo dnf install cronie
sudo systemctl enable crond
sudo systemctl start crond

3. Crea o edita un archivo crontab

La principal forma de programar tareas es con el comando crontab. Para crear un nuevo archivo crontab o editar uno existente, ejecuta:

crontab -e

Si tu sistema aún no tiene un archivo crontab para tu usuario, este comando crea uno automáticamente.

Si es la primera vez que ejecutas el comando, el sistema te pedirá que elijas un editor de texto, como nano o vim. nano suele ser más fácil para los principiantes.

Una vez abierto el archivo, añade tu tarea programada en una nueva línea.

Terminal nano

Para un desglose detallado de la sintaxis de cron, consulta nuestra guía sobre cómo escribir comandos crontab.

Consejo profesional

Antes de programar una tarea cron, prueba tu script manualmente para confirmar que funciona. Ejecuta el script directamente a través de SSH, por ejemplo ./backup.sh. Si no se ejecuta manualmente, tampoco lo hará a través de cron.

4. Observa tareas programadas

Para ver los cron jobs programados para tu cuenta de usuario sin editarlas, utiliza el indicador de lista:

crontab -l
Terminal crontab

Para ver los cron jobs de un usuario específico, ejecuta el siguiente comando y sustituye el nombre de usuario por el nombre de cuenta correspondiente. Ten en cuenta que esto requiere privilegios de root o elevados.

sudo crontab -u nombredeusuario -l

5. Concede acceso de root si es necesario

Algunos comandos, como las actualizaciones del sistema o los cambios en los archivos de configuración de todo el sistema, requieren privilegios de root. La forma más sencilla de programar estas tareas es añadirlas al crontab del usuario root:

sudo crontab -e

Cualquier comando en el crontab de root se ejecuta con privilegios de root y no requiere configuración adicional.

¡Importante! Evita ejecutar tareas como root a menos que sea necesario. Si un script sólo necesita acceso a archivos o directorios específicos, considera ajustar la propiedad de los archivos con el comando chown o utilizar una cuenta de servicio dedicada en su lugar.

6. Utiliza directorios cron para scripts recurrentes

Para los scripts de mantenimiento general que no necesitan ejecutarse en un minuto específico, puedes colocarlos en directorios predefinidos del sistema. 

El sistema ejecuta automáticamente los scripts que se encuentran en estas ubicaciones:

  • /etc/cron.hourly/
  • /etc/cron.daily/
  • /etc/cron.weekly/
  • /etc/cron.monthly/

Para ejecutarse correctamente, los scripts de estos directorios deben tener permisos de ejecución y seguir las reglas de nomenclatura de las partes de ejecución:

  • Los nombres de archivo sólo pueden incluir letras mayúsculas y minúsculas, dígitos, guiones bajos (_) y guiones (-).
  • Los nombres de archivo no deben utilizar extensiones de archivo. Por ejemplo, un script llamado backup.sh será ignorado. Cámbiale el nombre a backup.
  • Los nombres de archivo no deben contener puntos (.) en ninguna parte. Por ejemplo, mi.script fallará silenciosamente, lo cual es una fuente común de errores.

7. Elimina tareas programadas

Para eliminar todas las tareas cron para el usuario actual, utiliza la bandera remove:

crontab -r

Dado que este comando elimina todas las entradas al instante, es más seguro combinarlo con el indicador interactivo (-i). Esta opción pide confirmación antes de eliminar todas las tareas programadas:

crontab -ri
Terminal crontab -ri

¡Importante! La opción -i sólo funciona cuando se utiliza con -r. Ejecutar crontab -i por sí solo no tiene ningún efecto.

¿Cuál es el siguiente paso después de programar un cron job?

Los cron jobs automatizan tareas recurrentes combinando el daemon cron (que se ejecuta continuamente), el archivo crontab (que establece la programación) y el comando que realiza el trabajo. Esta automatización es esencial para una gestión eficaz del sistema y para realizar tareas rutinarias sin intervención manual.

Sin embargo, las tareas cron sólo son tan potentes como los scripts que ejecutan. El daemon cron ejecuta comandos en momentos determinados, pero el script realiza el trabajo real. Y si el script contiene errores, la tarea fallará aunque el trabajo cron se ejecute correctamente.

Aprender a escribir scripts Bash eficientes te permite automatizar tareas complejas y valiosas mediante cron. Echa un vistazo a nuestro tutorial de scripts Bash para empezar.

Todo el contenido de los tutoriales en este sitio web está sujeto a los rigurosos estándares y valores editoriales de Hostinger.

Author
El autor

Diego Boada

Diego es comunicador social, especialista en publicidad digital que trabaja constantemente en mejorar sus conocimientos de marketing digital, enfocándose en contenido y SEO. Idiomas, series, libros y cursos en internet son sus hobbies principales, además de los deportes. Este es su perfil de LinkedIn.

Lo que dicen nuestros clientes

Deja una respuesta

Por favor, rellena los campos obligatorios.Por favor, acepta la casilla de verificación Privacidad.Llena los campos requeridos y acepta la casilla de verificación de privacidad, por favor.

Thank you! Your comment has been successfully submitted. It will be approved within the next 24 hours.