Las tareas repetitivas consumen tiempo y se olvidan. Backups, limpieza de logs, renovación de certificados, actualizaciones… Todo esto puede automatizarse.
Cron es el programador de tareas de Linux. Lleva décadas funcionando y está en todos los servidores. Aprende a usarlo y tu VPS trabajará solo mientras duermes.
Qué es Cron
Cron es un demonio (servicio en segundo plano) que ejecuta comandos en horarios programados. Funciona 24/7 sin intervención.
Para qué usarlo
| Tarea | Frecuencia típica |
|---|---|
| Backups de base de datos | Diario |
| Backups de archivos | Diario/Semanal |
| Limpieza de logs | Semanal |
| Renovar certificados SSL | Mensual |
| Actualizar sistema | Semanal |
| Reportes automáticos | Diario/Semanal |
| Sincronización de datos | Cada hora |
| Monitorización | Cada 5 minutos |
Sintaxis de Crontab
Los 5 campos de tiempo
┌───────────── minuto (0-59)
│ ┌───────────── hora (0-23)
│ │ ┌───────────── día del mes (1-31)
│ │ │ ┌───────────── mes (1-12)
│ │ │ │ ┌───────────── día de la semana (0-7, 0 y 7 = domingo)
│ │ │ │ │
* * * * * comando
Valores especiales
| Símbolo | Significado | Ejemplo |
|---|---|---|
* | Cualquier valor | * * * * * = cada minuto |
, | Lista de valores | 1,15,30 = minutos 1, 15 y 30 |
- | Rango | 1-5 = lunes a viernes |
/ | Intervalo | */15 = cada 15 unidades |
Ejemplos de horarios
# Cada minuto
* * * * *
# Cada hora (minuto 0)
0 * * * *
# Todos los días a las 3:00
0 3 * * *
# Cada lunes a las 9:00
0 9 * * 1
# Primer día de cada mes a las 6:00
0 6 1 * *
# Cada 15 minutos
*/15 * * * *
# Cada 6 horas
0 */6 * * *
# De lunes a viernes a las 8:00
0 8 * * 1-5
# Dos veces al día (8:00 y 20:00)
0 8,20 * * *
Atajos especiales
@reboot # Al iniciar el sistema
@yearly # Una vez al año (0 0 1 1 *)
@monthly # Una vez al mes (0 0 1 * *)
@weekly # Una vez a la semana (0 0 * * 0)
@daily # Una vez al día (0 0 * * *)
@hourly # Cada hora (0 * * * *)
Comandos básicos
Ver crontab actual
crontab -l
Editar crontab
crontab -e
Se abre en el editor por defecto (nano, vim).
Eliminar crontab
crontab -r
Cuidado: Elimina todas las tareas sin confirmación.
Crontab de otro usuario (como root)
sudo crontab -u usuario -l
sudo crontab -u usuario -e
Crontab del sistema
Además del crontab de cada usuario, existe /etc/crontab para tareas del sistema:
sudo nano /etc/crontab
Formato ligeramente diferente (incluye usuario):
* * * * * usuario comando
Ejemplos prácticos para VPS
Backup diario de MySQL
# Backup de MySQL todos los días a las 3:00
0 3 * * * mysqldump -u root -p'contraseña' --all-databases | gzip > /backups/mysql/backup-$(date +\%Y\%m\%d).sql.gz
Mejor práctica: Usa un script separado:
# /root/scripts/backup-mysql.sh
#!/bin/bash
FECHA=$(date +%Y%m%d)
DESTINO="/backups/mysql"
mysqldump -u root -p'contraseña' --all-databases | gzip > "$DESTINO/backup-$FECHA.sql.gz"
# Eliminar backups de más de 7 días
find $DESTINO -name "*.sql.gz" -mtime +7 -delete
chmod +x /root/scripts/backup-mysql.sh
Crontab:
0 3 * * * /root/scripts/backup-mysql.sh
Backup de archivos web
# Backup de /var/www cada día a las 4:00
0 4 * * * tar -czf /backups/web/www-$(date +\%Y\%m\%d).tar.gz /var/www
Limpieza de logs antiguos
# Eliminar logs de más de 30 días cada domingo a las 2:00
0 2 * * 0 find /var/log -name "*.log" -mtime +30 -delete
Renovar certificados Let’s Encrypt
# Intentar renovar certificados cada día a las 5:00
0 5 * * * certbot renew --quiet
Certbot solo renueva si faltan menos de 30 días.
Actualizar sistema
# Actualizar paquetes cada domingo a las 3:00
0 3 * * 0 apt update && apt upgrade -y
Nota: En producción, mejor usar unattended-upgrades para actualizaciones de seguridad automáticas.
Reiniciar servicio
# Reiniciar PHP-FPM cada noche a las 4:00 (libera memoria)
0 4 * * * systemctl restart php8.3-fpm
Sincronizar hora
# Sincronizar hora cada 6 horas
0 */6 * * * ntpdate pool.ntp.org
Monitorizar disco
# Verificar espacio cada hora, alertar si > 90%
0 * * * * /root/scripts/check-disk.sh
Script check-disk.sh:
#!/bin/bash
USO=$(df / | tail -1 | awk '{print $5}' | tr -d '%')
if [ $USO -gt 90 ]; then
echo "Alerta: Disco al $USO%" | mail -s "VPS: Disco lleno" [email protected]
fi
Limpiar caché de WordPress
# Limpiar caché WP-CLI cada 6 horas
0 */6 * * * cd /var/www/wordpress && wp cache flush --allow-root
Optimizar tablas MySQL
# Optimizar tablas cada domingo a las 5:00
0 5 * * 0 mysqlcheck -o --all-databases -u root -p'contraseña'
Mejores prácticas
1. Usar rutas absolutas
# ❌ Mal
0 3 * * * backup.sh
# ✅ Bien
0 3 * * * /root/scripts/backup.sh
Cron no conoce tu PATH. Usa rutas completas.
2. Redirigir salida
Por defecto, cron envía la salida por email. Mejor redirigir:
# Silenciar todo
0 3 * * * /root/scripts/backup.sh > /dev/null 2>&1
# Guardar en log
0 3 * * * /root/scripts/backup.sh >> /var/log/backup.log 2>&1
# Solo guardar errores
0 3 * * * /root/scripts/backup.sh > /dev/null 2>> /var/log/backup-errors.log
3. Usar scripts en lugar de comandos largos
# ❌ Mal - difícil de leer y mantener
0 3 * * * mysqldump -u root -p'pass' db | gzip > /backup/db-$(date +\%Y\%m\%d).sql.gz && find /backup -mtime +7 -delete
# ✅ Bien - script separado
0 3 * * * /root/scripts/backup-db.sh
4. Escapar caracteres especiales
En crontab, % es especial. Escápalo con \:
# ❌ Mal
0 3 * * * echo $(date +%Y%m%d)
# ✅ Bien
0 3 * * * echo $(date +\%Y\%m\%d)
5. Añadir logs con timestamp
#!/bin/bash
echo "[$(date)] Iniciando backup..." >> /var/log/backup.log
# ... comandos ...
echo "[$(date)] Backup completado" >> /var/log/backup.log
6. Notificar errores
#!/bin/bash
if ! /root/scripts/backup.sh; then
echo "Backup fallido" | mail -s "Error en VPS" [email protected]
fi
7. Evitar solapamientos
Si una tarea puede tardar más que su intervalo:
#!/bin/bash
LOCKFILE=/tmp/backup.lock
if [ -f $LOCKFILE ]; then
echo "Ya hay un backup ejecutándose"
exit 1
fi
touch $LOCKFILE
trap "rm -f $LOCKFILE" EXIT
# ... comandos del backup ...
Depurar tareas cron
Ver log de cron
# Ubuntu/Debian
sudo grep CRON /var/log/syslog
# O en tiempo real
sudo tail -f /var/log/syslog | grep CRON
Probar comando manualmente
Antes de añadir a cron, ejecuta el comando manualmente para verificar que funciona.
Verificar que cron está corriendo
sudo systemctl status cron
Variables de entorno
Cron tiene un entorno mínimo. Si tu script necesita variables:
# En el script
#!/bin/bash
export PATH=/usr/local/bin:/usr/bin:/bin
export HOME=/root
# ... resto del script ...
O en crontab:
PATH=/usr/local/bin:/usr/bin:/bin
HOME=/root
0 3 * * * /root/scripts/backup.sh
Alternativas a cron
Systemd timers
Más moderno, mejor integración con systemd:
# /etc/systemd/system/backup.timer
[Unit]
Description=Backup diario
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
# /etc/systemd/system/backup.service
[Unit]
Description=Script de backup
[Service]
Type=oneshot
ExecStart=/root/scripts/backup.sh
sudo systemctl enable backup.timer
sudo systemctl start backup.timer
Anacron
Para máquinas que no están siempre encendidas. Ejecuta tareas pendientes al arrancar.
at
Para tareas únicas (no repetitivas):
echo "/root/scripts/tarea.sh" | at 15:00
Seguridad
Restringir quién puede usar cron
# /etc/cron.allow - usuarios permitidos
# /etc/cron.deny - usuarios denegados
Si existe cron.allow, solo esos usuarios pueden usar cron.
No guardar contraseñas en crontab
# ❌ Mal - contraseña visible
0 3 * * * mysqldump -u root -pMiContraseña db > backup.sql
# ✅ Bien - usar archivo de credenciales
0 3 * * * mysqldump --defaults-file=/root/.my.cnf db > backup.sql
/root/.my.cnf:
[mysqldump]
user=root
password=MiContraseña
chmod 600 /root/.my.cnf
Permisos de scripts
chmod 700 /root/scripts/*.sh
chown root:root /root/scripts/*.sh
Herramientas útiles
Crontab Guru
crontab.guru - Traductor visual de expresiones cron.
cronitor / healthchecks.io
Monitorización de tareas cron. Te avisa si una tarea no se ejecuta.
Generar expresiones
# Instalar herramienta
pip install python-crontab
# O usar generadores online
Checklist de automatización VPS
Backups (obligatorio)
| Tarea | Frecuencia | ✓ |
|---|---|---|
| Backup MySQL | Diario 3:00 | ☐ |
| Backup archivos | Diario 4:00 | ☐ |
| Backup offsite | Semanal | ☐ |
| Limpieza backups antiguos | Semanal | ☐ |
Mantenimiento
| Tarea | Frecuencia | ✓ |
|---|---|---|
| Renovar SSL | Diario (certbot) | ☐ |
| Limpiar logs | Semanal | ☐ |
| Actualizar sistema | Semanal/Auto | ☐ |
| Optimizar BD | Semanal | ☐ |
Monitorización
| Tarea | Frecuencia | ✓ |
|---|---|---|
| Check disco | Cada hora | ☐ |
| Check servicios | Cada 5 min | ☐ |
| Reportes | Diario/Semanal | ☐ |
Preguntas frecuentes
¿Por qué mi tarea cron no se ejecuta?
Causas comunes: ruta no absoluta, permisos incorrectos, error en sintaxis, variables de entorno faltantes. Revisa /var/log/syslog.
¿Cómo sé si cron ejecutó mi tarea?
Revisa el log de cron (grep CRON /var/log/syslog) o añade logging a tu script.
¿Puedo ejecutar cada 30 segundos?
Cron mínimo es cada minuto. Para segundos, usa un bucle en el script o systemd timers.
¿Las tareas se ejecutan si el servidor estaba apagado?
No. Cron no recupera tareas perdidas. Para eso existe anacron.
Nuestra recomendación
Tareas esenciales para todo VPS:
- Backup de BD - diario a las 3:00
- Backup de archivos - diario a las 4:00
- Renovación SSL - diario (certbot)
- Limpieza de logs - semanal
Con estas 4 tareas automatizadas, tu VPS se mantiene solo.
¿No quieres configurarlo tú? La administración gestionada incluye automatización profesional de backups y mantenimiento.
Conclusión
Cron es simple pero poderoso. Con unos minutos de configuración, automatizas horas de trabajo repetitivo y reduces el riesgo de olvidar tareas críticas como backups.
Empieza con lo básico: backup de base de datos y archivos. Añade más automatizaciones según necesites. Tu VPS trabajará mientras duermes.
¿Quieres un VPS con automatización preconfigurada? Explora los VPS de Avantys con soporte profesional.
Guías relacionadas
- Backups en VPS: guía completa
- Securizar un VPS Linux
- Monitorizar tu VPS con Netdata
- Docker en VPS: guía para principiantes
¿Quieres la guía completa con todos los casos de uso?
¿Quieres que lo hagamos por ti?
En Avantys gestionamos tu web, hosting y crecimiento digital de punta a punta. Tú a lo importante.