Hosting Equipo Avantys 9 min

Automatizar Tareas con Cron en tu VPS: Guía Completa

Aprende a usar cron para automatizar backups, mantenimiento, scripts y tareas repetitivas en tu VPS. Sintaxis, ejemplos y mejores prácticas.

// Compartir

Automatizar Tareas con Cron en tu VPS: Guía Completa

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

TareaFrecuencia típica
Backups de base de datosDiario
Backups de archivosDiario/Semanal
Limpieza de logsSemanal
Renovar certificados SSLMensual
Actualizar sistemaSemanal
Reportes automáticosDiario/Semanal
Sincronización de datosCada hora
MonitorizaciónCada 5 minutos

Sintaxis de Crontab

Sintaxis de crontab explicada

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ímboloSignificadoEjemplo
*Cualquier valor* * * * * = cada minuto
,Lista de valores1,15,30 = minutos 1, 15 y 30
-Rango1-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

Ejemplos de cron 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)

TareaFrecuencia
Backup MySQLDiario 3:00
Backup archivosDiario 4:00
Backup offsiteSemanal
Limpieza backups antiguosSemanal

Mantenimiento

TareaFrecuencia
Renovar SSLDiario (certbot)
Limpiar logsSemanal
Actualizar sistemaSemanal/Auto
Optimizar BDSemanal

Monitorización

TareaFrecuencia
Check discoCada hora
Check serviciosCada 5 min
ReportesDiario/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:

  1. Backup de BD - diario a las 3:00
  2. Backup de archivos - diario a las 4:00
  3. Renovación SSL - diario (certbot)
  4. 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


¿Quieres la guía completa con todos los casos de uso?

→ Volver a la guía maestra: Mejor VPS en España 2026

¿Quieres que lo hagamos por ti?

En Avantys gestionamos tu web, hosting y crecimiento digital de punta a punta. Tú a lo importante.

Hablar con Avantys
// Boletín

Suscríbete al boletín

Guías nuevas, sin spam. Cancela cuando quieras.