
Tienes un script de copia de seguridad. Funciona cuando lo ejecutas manualmente. Ahora necesitas que se ejecute a las 2:00 cada noche sin que tengas que supervisar el terminal. Ahí es donde entra cron, y dominar la sintaxis de crontab es la diferencia entre un script que se ejecuta según lo programado y uno que silenciosamente no hace nada mientras duermes.
Esta guía cubre todo lo que necesitas: el formato de crontab y los valores de sus campos, los caracteres especiales que hacen que la programación sea flexible, los pocos comandos de crontab que realmente usarás y ejemplos reales que puedes copiar y modificar. Sin contenido innecesario, sin rodeos.
Qué es Crontab y un trabajo Cron
Hay tres términos que a menudo se usan indistintamente cuando no deberían.
El daemon de cron (crond) es el proceso en segundo plano que se activa cada minuto, comprueba si hay tareas programadas y ejecuta las que correspondan. Lleva haciéndolo en sistemas Unix desde la década de 1970 y no interactúas directamente con él.
Un trabajo cron es cualquier tarea que has programado mediante cron. Una copia de seguridad de la base de datos a medianoche, una rotación de registros los domingos, una comprobación de estado cada cinco minutos. Cada uno es un trabajo cron.
Crontab (abreviatura de «tabla cron») es el archivo donde viven esos trabajos. Una línea por trabajo. Cada línea indica al daemon de cron exactamente cuándo ejecutar un comando y qué comando ejecutar.
Qué es la Sintaxis de Crontab
La sintaxis de crontab es el formato estructurado que se utiliza para definir cuándo debe ejecutarse un trabajo cron. Cada línea en el archivo de crontab sigue el mismo patrón: cinco campos de tiempo/fecha, luego el comando. El daemon de cron lee estas líneas, analiza los campos y los compara con la hora actual del sistema una vez por minuto. Si la sintaxis es incorrecta, no sucede nada: sin error, sin advertencia, solo silencio.
Formato de Crontab y Valores de Campo
Cada entrada de crontab utiliza cinco campos antes del comando. Siempre aparecen en este orden:
| Campo | Valores Permitidos |
| Minuto | 0-59 |
| Hora | 0-23 |
| Día del mes | 1-31 |
| Mes | 1-12 |
| Día de la semana | 0-6 (0 = Domingo; en algunos sistemas, 7 también significa Domingo) |
| Comando | El comando de shell a ejecutar |
Los cinco campos son obligatorios. Si no se necesita un campo en particular, debe rellenarse con un asterisco (*). Dejar un campo en blanco rompe la entrada sin que cron lo indique.
Caracteres Especiales de Crontab Explicados
Los valores numéricos simples tienen un alcance limitado. Estos caracteres especiales dotan a las expresiones cron de la flexibilidad necesaria para cubrir necesidades reales de programación:
| Símbolo | Qué Hace | Ejemplo |
* (asterisco) | Coincide con todos los valores posibles para ese campo | * en el campo de la hora = ejecutar cada hora |
, (coma) | Separa una lista de valores específicos | 1,3,5 en día de la semana = Lun, Mié, Vie |
- (guion) | Define un rango de valores consecutivos | 9-17 en el campo de la hora = 9 AM hasta 5 PM |
/ (barra diagonal) | Establece un valor/intervalo de paso | */10 en el campo de minutos = cada 10 minutos |
L | Último día del mes o último día específico de la semana | 1L en día de la semana = último lunes del mes |
W | Día laboral más cercano al día dado | 15W en día del mes = día laboral más cercano al 15 |
# (numeral) | Enésima ocurrencia de un día laboral en el mes | 2#3 = tercer martes del mes |
? (signo de interrogación) | Sin valor específico; usado en los campos de día | ? en día del mes = cualquier día |
Nota rápida: L, W, #, y ? no son soportados por todas las implementaciones de cron. El crontab estándar de Linux (Vixie cron) no los reconoce. Los encontraras en programadores basados en Quartz y en algunas variantes extendidas de cron. Usa *, comas, guiones y barras si quieres una sintaxis portátil.
Comandos Esenciales de Crontab
Solo necesitas cuatro comandos de crontab. Estos cuatro cubren el 99 % de los casos de uso: editar, listar y, ocasionalmente, eliminar.
crontab -eAbre el archivo de crontab para editarlo. Si no existe, crea uno nuevo. La primera vez, preguntará qué editor de texto prefieres.crontab -lLista todas las entradas actuales de crontab. Úsalo para verificar lo que está programado, ya que las suposiciones son la principal causa de fallos a las 3:00.crontab -rElimina el archivo de crontab completo — no una sola entrada, sino el archivo completo, sin aviso de confirmación.crontab -rihace lo mismo que -r pero solicita confirmación. Utiliza siempre esta opción.
Eso cubre el 99% de lo que harás. Editar, listar y ocasionalmente eliminar.
Cómo Usar Crontab con Ejemplos
Con la teoría cubierta, construyamos entradas de crontab reales. Abre el archivo de crontab:
crontab -eSi es la primera vez, el sistema pedirá que elijas un editor. Se recomienda nano si se busca la opción más sencilla. Se abrirá un archivo de texto donde cada nueva línea define un nuevo trabajo cron.
Nota importante: crontab utiliza la zona horaria del sistema. Si el servidor está configurado en UTC y se programa para las «9:00», eso es 9:00 UTC, no la hora local. Comprueba con timedatectl si hay dudas.
Programar un trabajo Cron a una hora específica
Por ejemplo, para ejecutar un script de shell el 10 de junio a las 8:30:
30 08 10 06 * /home/user/superbackup.shMinuto 30, hora 08, día 10, mes 06, cualquier día de la semana. El asterisco en el campo de día de la semana indica «sin restricción de día».
Ver entradas de Crontab con crontab -l
Para ver lo que ya está programado, ejecuta:
crontab -lEste comando muestra cada línea del archivo crontab en la terminal. Si la salida está vacía, no hay trabajos cron configurados.
Editar entradas de Crontab
Para modificar un horario o corregir una ruta, se usa el mismo comando que para crearlo:
crontab -eLocaliza la línea, edítala, guarda y sal. El daemon de cron detecta los cambios automáticamente, sin necesidad de reiniciar.
Ejecuta un trabajo cron cada minuto
Cinco asteriscos seguidos del comando: ese es el patrón para ejecución cada minuto:
* * * * * /home/user/systemhealthcheck.shEste comando se ejecuta una vez por minuto, a todas horas, todos los días. Úsalo para scripts de monitorización o comprobaciones rápidas. Evita usarlo para tareas pesadas, ya que podría saturar el servidor.
Programar un trabajo cron diario
El atajo @daily ejecuta un comando una vez al día a la medianoche (00:00):
@daily /home/user/systemcleanup.shEs más conciso que escribir 0 0 * * * y equivale a lo mismo. También hay @weekly (domingo a medianoche), @hourly (minuto 0 de cada hora) y @annually (1 de enero a medianoche).
Programar un trabajo cron para un rango de tiempo
Para ejecutar un script solo durante el horario laboral, utiliza un guion en el campo de la hora:
00 08-17 * * * /home/user/sync.shEsto se ejecuta al inicio de cada hora de 8:00 a 17:00, todos los días. Para restringirlo a los fines de semana, añade un rango de días de la semana:
00 08-17 * * 6-0 /home/user/sync.shAhora se ejecuta solo el sábado (6) hasta el domingo (0).
Horarios de cron mensuales y anuales
El atajo @monthly ejecuta un trabajo a la medianoche del día 1 de cada mes:
@monthly /home/user/monthlyreport.shEquivalente a 0 0 1 * *. Y @yearly (o @annually) se ejecuta el 1 de enero a medianoche. Útil para renovaciones de certificados, archivos de registros anuales o cualquier tarea que deba ejecutarse exactamente una vez al año.
Ejecutar un trabajo cron varias veces al día
Los valores separados por comas permiten alcanzar múltiples horarios específicos. Cinco veces al día: a las 12:00, 15:00, 17:00, 19:00 y 21:00:
0 12,15,17,19,21 * * * /home/user/report.shCada valor en el campo de hora actúa como un disparador independiente. El campo de minutos es 0, por lo que se ejecuta al inicio de cada una de esas horas.
Ejecutar un comando después del reinicio del sistema
La directiva @reboot ejecuta un comando una sola vez, justo después de que el sistema arranca:
@reboot /home/user/startservices.shÚtil para iniciar daemons en segundo plano, restablecer túneles SSH o arrancar agentes de monitorización que no tienen archivos de servicio systemd. Solo se ejecuta al iniciar el sistema, no cuando se reinicia el daemon de cron.
Ubicación del archivo Crontab en Linux
La ubicación de los archivos crontab depende del sistema operativo:
- Debian/Ubuntu –
/var/spool/cron/crontabs/ - Red Hat/CentOS/Fedora –
/var/spool/cron/ - macOS –
/var/at/tabs/
Puedes consultarlos directamente, pero editarlos a mano omite la verificación de sintaxis de cron. Es preferible usar crontab -e.
Configuración adicional de Crontab
Lo básico maneja la mayoría de los casos de uso. Pero cuando los trabajos cron empiecen a multiplicarse, conviene configurar el registro, controlar las notificaciones por correo y definir correctamente el entorno.
Crea un archivo de registro de crontab
Por defecto, la salida de los trabajos cron se descarta a menos que se capture. Para redirigir stdout y stderr a un archivo de registro:
* * * * * /home/user/script.sh >> /var/log/cronjob.log 2>&1El >> añade en lugar de sobrescribir, manteniendo así un historial. El 2>&1 envía los mensajes de error al mismo archivo que la salida estándar. Sin esto, el script puede fallar silenciosamente durante semanas sin que se detecte hasta que algo dependiente deje de funcionar.
Desactivar las notificaciones por correo electrónico de Crontab
Cron envía un correo electrónico al usuario por cada trabajo que produce salida. En un sistema con alta actividad, esto genera un volumen considerable de correo local que nadie lee. Para suprimirlo, añade:
>/dev/null 2>&1Añade esto al final de cualquier línea de trabajo cron. Envía tanto stdout como stderr a /dev/null. Asegúrate de tener configurado el registro por separado, o el sistema operará sin visibilidad.
Variables de entorno de Crontab
Cron no carga el perfil de shell, lo que significa que PATH, SHELL y otras variables de entorno son mínimas por defecto. Es recomendable definirlas al inicio del archivo crontab:
- PATH – indica a cron dónde encontrar ejecutables. El valor predeterminado suele ser /usr/bin:/bin, por lo que los scripts en /usr/local/bin pueden fallar inesperadamente.
- SHELL – define qué shell utiliza cron. Por defecto es /bin/sh, no bash. Si los scripts utilizan características de bash, establece este valor en /bin/bash.
- LOGNAME – nombre de usuario propietario del crontab, obtenido de /etc/passwd.
- HOME – directorio de inicio del propietario del crontab, también obtenido de /etc/passwd.
Defínelas como cualquier variable de shell al inicio del crontab, antes de las entradas de trabajo:
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin* * * * * /home/user/script.shEsta es la razón más frecuente por la que los trabajos cron funcionan de forma interactiva pero fallan cuando se programan. Comprueba siempre el PATH en primer lugar.