Cron jobs en Linux: automatiza tareas como un sysadmin
Si administras servidores Linux, hay una herramienta que vas a usar sí o sí: cron. Backups automáticos, scripts de limpieza, reportes nocturnos… todo eso se hace con cron jobs. En este post te explico cómo funciona y cómo sacarle partido desde el primer día.
¿Qué es cron?
Cron es el planificador de tareas de Linux. Funciona como un demonio en segundo plano (crond) que revisa cada minuto si hay alguna tarea programada para ejecutar. Simple, pero increíblemente potente.
Las tareas se definen en un archivo llamado crontab (cron table). Cada usuario del sistema puede tener el suyo propio, y también existe uno del sistema para tareas administrativas.
La sintaxis del crontab
Esta es la parte que asusta al principio, pero en cuanto la entiendes no tiene ningún misterio:
# ┌───────── minuto (0-59)
# │ ┌─────── hora (0-23)
# │ │ ┌───── día del mes (1-31)
# │ │ │ ┌─── mes (1-12)
# │ │ │ │ ┌─ día de la semana (0-7, donde 0 y 7 = domingo)
# │ │ │ │ │
# * * * * * comando a ejecutar
El * significa «todos los valores posibles». Veamos ejemplos reales:
# Cada minuto
* * * * * /usr/bin/script.sh
# Cada hora (en el minuto 0)
0 * * * * /usr/bin/script.sh
# Todos los días a las 2:30 de la madrugada
30 2 * * * /usr/bin/backup.sh
# Los lunes a las 8:00
0 8 * * 1 /usr/bin/reporte.sh
# El día 1 de cada mes a medianoche
0 0 1 * * /usr/bin/limpieza-mensual.sh
# Cada 15 minutos
*/15 * * * * /usr/bin/check.sh
# De lunes a viernes a las 9:00
0 9 * * 1-5 /usr/bin/trabajo.sh
Si no quieres calcular la sintaxis a mano, crontab.guru es una herramienta online que te lo traduce en segundos.
Cómo editar el crontab
# Editar el crontab del usuario actual
crontab -e
# Ver el crontab actual sin editarlo
crontab -l
# Eliminar todo el crontab del usuario actual (¡cuidado!)
crontab -r
# Editar el crontab de otro usuario (requiere root)
crontab -u victor -e
La primera vez que ejecutas crontab -e te preguntará qué editor usar. Yo recomiendo nano si no estás muy suelto con vim.
Ejemplos prácticos que uso en producción
Backup diario de base de datos
# Backup de MySQL todos los días a las 3:00
0 3 * * * mysqldump -u root -pTUPASSWORD mi_base_de_datos > /backups/db_$(date +%Y%m%d).sql
Limpieza de logs antiguos
# Borrar logs de más de 30 días cada domingo a la 1:00
0 1 * * 0 find /var/log/myapp -name "*.log" -mtime +30 -delete
Reiniciar un servicio caído
# Verificar cada 5 minutos si nginx está corriendo y levantarlo si no
*/5 * * * * systemctl is-active --quiet nginx || systemctl start nginx
Renovar certificados SSL automáticamente
# Intentar renovar certificados Let's Encrypt dos veces al día
0 0,12 * * * certbot renew --quiet
Atajos especiales de cron
Cron tiene algunos atajos que hacen el crontab más legible:
| Atajo | Equivalente | Cuándo se ejecuta |
|---|---|---|
@reboot | — | Al arrancar el sistema |
@hourly | 0 * * * * | Cada hora |
@daily | 0 0 * * * | Cada día a medianoche |
@weekly | 0 0 * * 0 | Cada domingo a medianoche |
@monthly | 0 0 1 * * | El día 1 de cada mes |
@yearly | 0 0 1 1 * | El 1 de enero |
# Ejecutar script al arrancar el servidor
@reboot /usr/bin/mi-script-inicio.sh
# Backup diario con atajo
@daily /usr/bin/backup.sh
Variables de entorno en cron
Esto es algo que pilla a mucha gente. Cron no carga el entorno de tu usuario, así que comandos que funcionan en tu terminal pueden fallar en cron. La solución es sencilla:
# Definir variables al principio del crontab
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=victor@todolinux.cloud
# A partir de aquí tus tareas
0 3 * * * /usr/bin/backup.sh
MAILTO es especialmente útil — si el comando genera alguna salida, cron te la manda por email. Así te enteras si algo falla.
Cómo depurar un cron job que no funciona
El problema más típico con cron: «en mi terminal funciona, pero en cron no». Aquí el proceso que sigo yo:
- Redirige la salida a un archivo de log para ver qué pasa:
* * * * * /usr/bin/script.sh >> /var/log/mi-cron.log 2>&1
- Usa rutas absolutas siempre — ni
./script.shni~/script.sh, sino/home/victor/script.sh. - Revisa los logs del sistema para ver si cron ejecutó la tarea:
# En sistemas con systemd
journalctl -u cron --since "1 hour ago"
# En sistemas con syslog
grep CRON /var/log/syslog | tail -20
Crontab del sistema vs crontab de usuario
Además del crontab de cada usuario, Linux tiene archivos de cron del sistema en /etc/crontab y los directorios /etc/cron.d/, /etc/cron.daily/, /etc/cron.hourly/, etc.
# Ver el crontab del sistema
cat /etc/crontab
# Scripts que se ejecutan diariamente
ls /etc/cron.daily/
# Añadir un script al cron diario del sistema
cp mi-script.sh /etc/cron.daily/
chmod +x /etc/cron.daily/mi-script.sh
La diferencia con /etc/crontab es que incluye un campo extra para especificar el usuario que ejecuta el comando:
# formato: minuto hora dia mes diasemana USUARIO comando
0 3 * * * root /usr/bin/backup.sh
Conclusión
Cron es de esas herramientas que una vez las usas no puedes vivir sin ellas. Backups automáticos, limpieza de logs, monitorización básica… todo lo que se repite en el tiempo puede delegarse a cron.
¿Vale la pena aprenderse la sintaxis? Totalmente. Y con crontab.guru como ayuda, en 5 minutos tienes cualquier expresión lista.
En el siguiente post veremos SSH sin contraseña con claves públicas — otro imprescindible para cualquier sysadmin. Déjame en los comentarios qué tareas tienes automatizadas con cron.
