cron: programación de tareas en Linux
cron es el planificador de tareas de Linux. Permite ejecutar comandos o scripts de forma automática en momentos concretos: a una hora fija, cada cierto intervalo, una vez a la semana, etc. Es la herramienta estándar para backups automáticos, sincronizaciones periódicas, envío de informes o cualquier tarea que deba repetirse sin intervención humana.
El archivo crontab
Cada usuario tiene su propio crontab (tabla de tareas cron). Para editarlo:
crontab -e # abrir editor del crontab del usuario actual
crontab -l # listar las tareas actuales
crontab -r # eliminar todo el crontab (¡cuidado!)
Nota: la primera vez que ejecutas crontab -e puede pedirte que elijas un editor. nano es la opción más sencilla si no estás familiarizado con vim.
Sintaxis: los cinco campos
Cada línea del crontab sigue este formato:
minuto hora día_del_mes mes día_de_la_semana comando
| Campo | Rango | Significado |
|---|---|---|
| minuto | 0–59 | El minuto exacto de la hora |
| hora | 0–23 | La hora (formato 24h) |
| día del mes | 1–31 | Día del mes |
| mes | 1–12 | Mes del año |
| día de la semana | 0–7 | 0 y 7 = domingo, 1 = lunes… |
El símbolo * significa "cualquier valor" en ese campo.
Ejemplos de programación
# Cada minuto
* * * * * /ruta/al/script.sh
# Cada día a las 2:30 de la madrugada
30 2 * * * /ruta/al/backup.sh
# Cada lunes a las 9:00
0 9 * * 1 /ruta/al/informe.sh
# El primer día de cada mes a las 00:00
0 0 1 * * /ruta/al/facturacion.sh
# Cada 15 minutos
*/15 * * * * /ruta/al/comprobacion.sh
# A las 8:00, 12:00 y 18:00 todos los días
0 8,12,18 * * * /ruta/al/aviso.sh
# De lunes a viernes a las 7:00
0 7 * * 1-5 /ruta/al/laborable.sh
Atajos de tiempo predefinidos
cron acepta también estas palabras clave en lugar de los cinco campos:
@reboot /ruta/al/script.sh # al arrancar el sistema
@hourly /ruta/al/script.sh # una vez por hora (equivale a: 0 * * * *)
@daily /ruta/al/script.sh # una vez al día (equivale a: 0 0 * * *)
@weekly /ruta/al/script.sh # una vez a la semana
@monthly /ruta/al/script.sh # una vez al mes
Variables de entorno en crontab
El entorno de cron es mínimo: no tiene el mismo $PATH que tu terminal. Por eso los comandos que funcionen en terminal pueden fallar en cron. Soluciones:
# Opción 1: definir PATH al inicio del crontab
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Opción 2: usar rutas absolutas siempre en los comandos
0 2 * * * /usr/bin/php /var/www/mi_script.php
# Para recibir errores por email (si el servidor tiene MTA):
MAILTO="tu@email.com"
Redirigir el output
Por defecto, cualquier salida que produzca el comando se envía por email al usuario. Es más práctico redirigirla a un log:
# Guardar stdout y stderr en un log
0 2 * * * /ruta/al/backup.sh >> /var/log/backup.log 2>&1
# Descartar toda la salida si no necesitas registros
0 2 * * * /ruta/al/script.sh > /dev/null 2>&1
Cron del sistema
Además del crontab de usuario, el sistema tiene directorios especiales para tareas del sistema. Basta con depositar un script ejecutable en el directorio correspondiente:
/etc/cron.hourly/ # scripts que se ejecutan cada hora
/etc/cron.daily/ # cada día
/etc/cron.weekly/ # cada semana
/etc/cron.monthly/ # cada mes
También puedes crear archivos de crontab individuales en /etc/cron.d/ con la misma sintaxis que el crontab de usuario, pero añadiendo el nombre de usuario como sexto campo:
# Formato en /etc/cron.d/mi-tarea:
30 3 * * * root /ruta/al/script.sh >> /var/log/script.log 2>&1
Buenas prácticas
- Usa siempre rutas absolutas tanto para el comando como para sus argumentos y archivos.
- Redirige el output a un log para poder depurar si algo falla.
- Prueba el script manualmente antes de añadirlo al crontab.
- Escribe un comentario encima de cada línea explicando qué hace y por qué.
- Comprueba los logs de cron si algo no funciona:
grep cron /var/log/syslog.
En la próxima lección: tmux: multiplexor de terminal para trabajar con varias sesiones y paneles, especialmente útil en conexiones SSH.