¿Qué es cron y crontab?
En sistemas Unix/Linux, cron es un demonio (proceso en segundo plano) que ejecuta comandos o scripts a intervalos regulares. El nombre viene del griego chronos (χρόνος), «tiempo».
Crontab es el fichero de texto donde se definen todas las tareas programadas. Cada usuario del sistema tiene su propio fichero crontab. El ubicado en /etc/ pertenece al usuario root.
Comandos Básicos de Crontab
| Comando | Acción |
|---|---|
| crontab -l | Listar las tareas programadas del usuario actual. |
| sudo crontab -l | Listar las tareas del usuario root. |
| crontab -e | Editar el fichero crontab. Abre el editor definido en $EDITOR. |
| crontab -r | Borrar todo el crontab del usuario actual. |
| crontab -u usuario | Operar sobre el crontab de otro usuario (requiere sudo). |
export EDITOR="nano" # usar nano como editor export EDITOR="vim" # o vim si lo prefieres
sudo crontab -e
Estructura de una Línea Crontab
Cada tarea ocupa una línea con exactamente 6 campos: cinco de tiempo y uno con el comando a ejecutar.
* es el comodín universal — significa «todos los valores posibles». Por ejemplo, * en el campo Hora significa «a todas las horas».Campos y Valores Válidos
| Campo | Rango | Operadores | Ejemplo |
|---|---|---|---|
| Minuto | 0–59 |
* , - / |
30 → al minuto 30 · */15 → cada 15 min |
| Hora | 0–23 |
* , - / |
9 → a las 9 AM · 9-17 → de 9 a 17 |
| Día del mes | 1–31 |
* , - / |
1 → el día 1 · 1,15 → días 1 y 15 |
| Mes | 1–12 |
* , - / |
12 → diciembre · */6 → cada 6 meses |
| Día semana | 0–7 (0 y 7 = Dom) |
* , - / |
1-5 → lunes a viernes · 5 → viernes |
Operadores especiales
| Operador | Significado | Ejemplo |
|---|---|---|
| * | Cualquier valor (comodín) | * * * * * → cada minuto |
| , | Lista de valores | 10,14,18 → a las 10, 14 y 18 h |
| - | Rango de valores | 1-5 → lunes a viernes |
| / | Intervalo (cada N) | */15 → cada 15 minutos |
Cadenas Especiales (Shorthands)
Estas palabras reservadas reemplazan los cinco campos de tiempo para los usos más comunes. Se ponen en la posición del primer campo.
Ejemplo práctico con @reboot
Registrar la fecha y hora de cada inicio del equipo en un archivo de log:
@reboot date >> /home/jose/inicios.txt
@reboot date >> inicios.txt es muy útil para saber si alguien ha encendido tu equipo cuando no estabas. Cada arranque queda registrado con fecha y hora exactas.Ejemplos — Frecuencia Básica
La sintaxis básica es: Minuto Hora DíaMes Mes DíaSemana Comando
| Expresión | Descripción |
|---|---|
| * * * * * /ruta/cmd | Cada minuto. El asterisco en todas las posiciones. |
| 0 * * * * /ruta/cmd | Cada hora — al minuto 0 de cada hora. |
| 0 9 * * * /ruta/cmd | Todos los días a las 9:00 AM. |
| 0 0 * * * /ruta/cmd | Todas las noches a medianoche (00:00). |
Ejemplo clásico — Actualizar el sistema a medianoche
00 00 * * * root apt-get update && apt-get -y upgrade
# Equivalente con shorthand:
@daily root apt-get update && apt-get -y upgrade
Ejemplos — Rangos y Listas
Usa la coma , para listar valores y el guion - para rangos.
| Expresión | Descripción |
|---|---|
| 0 10,14,18 * * * /cmd | Tres veces al día: a las 10:00, 14:00 y 18:00 h. |
| 0 9-17 * * * /cmd | Cada hora de 9 AM a 5 PM (horario laboral). |
| 30 1 * * 1-5 /cmd | De lunes a viernes a la 1:30 AM. (1=Lun, 5=Vie) |
| 0 12 1,15 * * /cmd | Los días 1 y 15 de cada mes a las 12:00 PM. |
Ejemplos — Intervalos
Usa la barra diagonal / para indicar «cada N unidades de tiempo».
| Expresión | Descripción |
|---|---|
| */15 * * * * /cmd | Cada 15 minutos (minutos 0, 15, 30, 45). |
| 0 */4 * * * /cmd | Cada 4 horas (a las 0, 4, 8, 12, 16, 20 h). |
| 0 0 1 */6 * /cmd | Cada 6 meses, el día 1 a medianoche. |
Ejemplos — Fechas y Días Específicos
| Expresión | Descripción |
|---|---|
| 0 2 1 * * /cmd | El primer día de cada mes a las 2:00 AM. |
| 0 10 * * 5 /cmd | Todos los viernes a las 10:00 AM. (5 = Viernes) |
| 0 3 * 12 0 /cmd | Solo en diciembre, todos los domingos a las 3:00 AM. (12=Dic, 0=Dom) |
Casos de Uso — Registro con echo
Usando echo para escribir mensajes en un archivo de log, ideal para comprobar que cron funciona correctamente.
| Expresión Crontab | Descripción |
|---|---|
| */5 * * * * echo "Cada 5 min" >> /tmp/cron-log.txt | Cada 5 minutos añade una línea al archivo de registro. |
| 30 14 10 * * echo "Día 10" >> /tmp/cron-log.txt | El día 10 de cada mes a las 14:30, registra un recordatorio. |
| 0 8 * * 1-5 echo "Inicio jornada" >> /tmp/cron-log.txt | De lunes a viernes a las 8:00 AM, registra el inicio de jornada. |
Casos de Uso — Script de Backup
El verdadero potencial de cron se despliega combinándolo con scripts de shell. Primero hay que crear el script y darle permisos de ejecución.
El script backup_diario.sh
sudo nano /home/jose/scripts/backup_diario.sh
#!/bin/bash FECHA=$(date +\%Y\%m\%d) tar -czf /backups/copia_$FECHA.tar.gz /home/jose/Documentos 2>&1 echo "Copia de seguridad $FECHA completada." >> /var/log/backup.log
% en crontab: En una entrada de crontab, el carácter % se interpreta como salto de línea. Cuando lo uses dentro de un comando crontab (no en un script externo), debes escaparlo como \%. Si el comando está en un script .sh separado, esto no aplica.chmod ugo+x /home/jose/scripts/backup_diario.sh
chmod +x), cron intentará ejecutar el script pero fallará silenciosamente. El script nunca se ejecutará hasta que tenga permisos correctos.Entradas crontab para el backup
| Expresión Crontab | Descripción |
|---|---|
| 0 3 * * * /home/jose/scripts/backup_diario.sh | Cada noche a las 3:00 AM. Ideal para backups diarios de mantenimiento. |
| 0 20 * * 5 /home/jose/scripts/backup_diario.sh | Todos los viernes a las 20:00 h. Backup semanal. |
| 30 0 1 * * /home/jose/scripts/backup_diario.sh | El primer día de cada mes a las 00:30 AM. Backup mensual. |
Añadir Tareas a Crontab — Paso a Paso
- Abre el crontab de tu usuario:
crontab -e - Desplázate al final del fichero con las teclas de cursor.
- Pega o escribe la línea de la tarea deseada.
- En nano: guarda con Ctrl+O, confirma con Enter, sal con Ctrl+X. Crontab se activa automáticamente al guardar.
Borrar todo el crontab
crontab -r # Elimina TODAS las tareas del usuario actual
crontab -r borra todo el fichero sin confirmación. Si solo quieres eliminar una tarea concreta, usa crontab -e y borra la línea manualmente.