PTENES
MÓDULO 4.4

⏰ Cron: Tareas automáticas

Cron es el despertador programable del servidor. Le dices «todos los días a las 3 de la mañana, haz la copia de seguridad» y el servidor lo hace solo, para siempre. Aquí aprenderás a programar tareas que se ejecutan sin que tengas que estar ahí.

6
Temas
45
Minutos
Básico
Nivel
Práctico
Tipo
1

Qué es cron

O cron es un programa que ya viene instalado en todos los servidores Linux. Su trabajo es sencillo: estar pendiente del reloj y, a la hora indicada, ejecutar los comandos que programaste. Escribes la tarea una vez y empieza a repetirse sola para siempre, sin que tengas que volver a abrir la terminal.

CRON: LA LÍNEA DEL TIEMPO DE UN DÍA EN EL SERVIDOR cron 00h 06h 12h 23h respaldo 03h limpieza 04h informe de las 09h verificación cada 5 min

🧠 Analogía: el despertador programable

Piensa en cron como el despertador de tu celular, solo que mucho más poderoso. En el despertador, defines una hora y una acción: "07h, reproducir la música". En cron, defines una hora y un comando: "03h, ejecutar la copia de seguridad".

  • •Suena el despertador todos los días a la misma hora, aunque no estés mirando.
  • •Cron ejecuta el comando todos los días a la hora programada, aunque nadie haya iniciado sesión en el servidor.
  • •La diferencia: el despertador hace ruido; cron lo hace trabajo (respaldo, limpieza, envío de correo electrónico).

💡 Por qué se usa tanto cron

Todo trabajo que necesita si se repite con el tiempo y puede convertirse en un cron: copia de seguridad de la base de datos, limpieza de archivos temporales, renovación de certificados, envío de informes, verificación de sitios activos. En vez de que recuerdes hacerlo manualmente (y lo olvides la mitad de las veces), cron lo hace en piloto automático. Cada tarea programada se llama un tarea cron.

2

La sintaxis del crontab: los 5 campos

Cada línea de programación tiene 5 campos de tiempo seguidos del comando. Los 5 campos responden, de izquierda a derecha: en qué minuto, a qué hora, en qué día del mes, en qué mes y en qué día de la semana. Después de ellos viene el comando que debe ejecutarse.

LA LÍNEA DEL CRONTAB * * * * * comando minuto 0-59 hora 0-23 día del mes 1-31 mes 1-12 día de la semana 0-6 (dom=0) * significa "todos": cada minuto, cada hora, cada día...

La regla de oro

El asterisco * quiere decir «cualquier valor». La tarea solo se ejecuta cuando todos los campos coinciden con el reloj actual.

# minuto hora día mes día de la semana comando

* * * * * comando

# La línea de arriba se ejecuta CADA MINUTO (todo es *)

Ejemplos para leer con calma

0 3 * * * # todos los días a las 03h00

30 8 * * 1 # todos los lunes a las 08h30

*/5 * * * * # cada 5 minutos

0 */2 * * * # cada 2 horas, en el minuto 0

0 0 1 * * # el día 1 de cada mes, a medianoche

0 9 * * 1-5 # de lunes a viernes a las 09h00 (días hábiles)

O / significa "de N en N". El - y un intervalo. La coma (1,15) enumera valores específicos.

💡 Consejo: usa crontab.guru

Si tienes dudas sobre lo que hace una línea, pégala en el sitio crontab.guru. Traduce la expresión a un español sencillo ("cada 5 minutos", "todos los domingos a medianoche"). Es la forma más rápida de comprobar que escribiste la hora correcta antes de guardar.

3

crontab -e: Agregar tareas

Para ver y editar las tareas programadas de tu usuario, usa el comando crontab. Abre un archivo especial donde cada línea es una tarea programada. No editas ese archivo directamente: dejas que el comando crontab -e abrir el editor para ti.

1

Abre el editor de tareas

$ crontab -e

# La primera vez, te pregunta qué editor usar.

Select an editor. To change later, run 'select-editor'.

1. /bin/nano <---- más fácil

2. /usr/bin/vim.basic

# Elige 1 (nano) escribiendo 1 y Enter.

2

Agrega una línea al final del archivo

# Se ejecuta todos los días a las 03h00

0 3 * * * /home/usuario/backup.sh

Cada tarea queda en una línea. Usa la ruta completa del script para evitar sorpresas.

3

Guarda y sal

# En nano: Ctrl+O, Enter (guardar), después Ctrl+X (salir)

crontab: installing new crontab

El mensaje "installing new crontab" confirma que cron ya registró tu programación.

Comandos para administrar el crontab

# Editar las tareas

$ crontab -e

# Ver (listar) las tareas actuales

$ crontab -l

0 3 * * * /home/usuario/backup.sh

# Borrar TODAS las tareas (cuidado)

$ crontab -r

⚠️ Error común

Problema: "Mi script se ejecuta en la terminal, pero cron no ejecuta nada."
Solución: Casi siempre es una ruta. El cron se ejecuta con un entorno casi vacío, sin tu PATH. Usa siempre rutas completas (ej.: /usr/bin/python3 /home/usuario/script.py en vez de solo python3 script.py) y dale permiso de ejecución con chmod +x backup.sh.

4

Ejemplos prácticos del día a día

La teoría solo sirve cuando se convierte en práctica. Aquí tienes tres tareas que prácticamente todo servidor termina necesitando: un respaldo diario, una limpieza de registros antiguos y uno informe semanal. Copia, adapta las rutas y úsalo.

💾 Copia de seguridad diaria de la base de datos

Todos los días a las 02h00, compacta la base de datos y la guarda con la fecha en el nombre del archivo.

# crontab -e y agrega:

0 2 * * * pg_dump app | gzip > /backups/app-$(date +\%F).sql.gz

# Resultado, un archivo por día:

/backups/app-2026-06-17.sql.gz

/backups/app-2026-06-18.sql.gz

En crontab, el signo de porcentaje debe convertirse en \% (con barra), de lo contrario cron lo interpreta como un salto de línea.

🧹 Limpieza de logs antiguos

Todos los domingos de madrugada, borra los archivos de registro con más de 30 días.

# Domingo a las 04h00 (día de la semana = 0)

0 4 * * 0 find /var/log/app -name "*.log" -mtime +30 -delete

-mtime +30 = modificado hace más de 30 días. Así los logs no llenan el disco del servidor.

📊 Informe semanal por correo electrónico

Todos los lunes a las 08h00, ejecuta un script que prepara el informe de la semana y lo envía.

# Lunes (día de la semana = 1) a las 08h00

0 8 * * 1 /usr/bin/python3 /home/usuario/relatorio.py

✓ Qué HACER

  • ✓Usar la ruta completa de scripts y binarios
  • ✓Probar el comando en la terminal antes de programarlo
  • ✓Ejecutar tareas pesadas de madrugada

✗ Qué NO hacer

  • ✗Usar rutas relativas (ej.: ./script.sh)
  • ✗Olvidar escapar el % con \%
  • ✗Programar todo para el mismo minuto (sobrecarga)
5

Logs: saber si cron se ejecutó

Cron es silencioso: se ejecuta en segundo plano y no muestra nada en tu pantalla. Por eso, la pregunta más común es "¿se habrá ejecutado?". La respuesta está en los logs. El sistema registra cada vez que se ejecuta un cron job, y puedes redirigir la salida de tu comando a un archivo propio.

👁 Dónde cron registra la ejecución

# Ubuntu/Debian: el registro queda en syslog

$ grep CRON /var/log/syslog

Jun 17 03:00:01 srv CRON[1234]: (usuario) CMD (/home/usuario/backup.sh)

# En muchos sistemas, también:

$ journalctl -u cron --since today

Estas líneas demuestran que el cron se activó el comando. Pero no muestran lo que imprimió tu comando ni si dio un error. Para eso, redirige la salida.

Redirigir la salida a un archivo

Agrega >> arquivo.log 2>&1 al final de la línea. Así, tanto la salida normal como los errores irán al archivo.

# Guarda la salida y los errores en backup.log

0 2 * * * /home/usuario/backup.sh >> /home/usuario/backup.log 2>&1

# Después, lee el archivo para comprobar

$ tail -n 20 /home/usuario/backup.log

[2026-06-17 02:00] Copia de seguridad completada: 1 tabla, 3.2 MB

Qué significa cada parte

  • •>> agrega al final del archivo (sin borrar lo que ya tenía).
  • •> (sobrescribe el archivo en cada ejecución).
  • •2>&1 envía los errores al mismo lugar que la salida normal.

💡 Consejo: cron puede enviarte un correo electrónico

Si un cron job imprime algo y tú no redirecciona la salida, cron intenta enviar esa salida por correo electrónico a quien creó la tarea (variable MAILTO). En servidores sin el correo configurado, esto solo genera ruido. Por eso se suele redirigir siempre a un archivo de log y leerlo desde allí.

6

Alternativa: temporizadores de systemd

Cron es excelente y sencillo, pero existe un hermano más moderno: los systemd timers. En el módulo 4.3 viste cómo systemd administra servicios. También sabe programar tareas. Un timer activa un service en el momento adecuado, parecido a cron, pero con más funciones.

Cómo se ve un temporizador

Son dos archivos: uno .service (qué ejecutar) y un .timer (cuándo ejecutar).

# backup.timer

[Timer]

OnCalendar=*-*-* 03:00:00

Persistent=true

[Install]

WantedBy=timers.target

# Activar y ver los timers activos

$ systemctl enable --now backup.timer

$ systemctl list-timers

La línea Persistent=true hace que la tarea se ejecute en cuanto se enciende la máquina, en caso de que estuviera apagada a la hora programada. El cron simple no hace eso.

⏰ Prefiere cron cuando

  • ✓La tarea es simple (un comando, un horario)
  • ✓Quieres escribir y olvidarte rápido
  • ✓El servidor permanece encendido todo el tiempo

⚙ Prefiere un temporizador de systemd cuando

  • ✓Necesitas ejecutar lo que te perdiste mientras estaba apagado
  • ✓¿Quieres logs integrados en journalctl
  • ✓Ya administras el resto con systemd

🧠 Analogía: dos despertadores

Cron es el despertador analógico de la mesita de noche: confiable, directo; giras la manecilla y listo. El temporizador de systemd es el despertador del celular con app: una alarma inteligente que repite lo que te perdiste y guarda un historial de cuándo sonó. Ambos te despiertan. Empieza con cron; cuando necesites las funciones adicionales, migra al temporizador.

📚 Resumen del módulo

✓
Cron es el despertador del servidor - ejecuta comandos por su cuenta en el horario programado
✓
5 campos: minuto hora día mes día de la semana - * = cualquier valor
✓
crontab -e, -l, -r - editar, listar y eliminar tareas
✓
Ruta completa y log - usa la ruta absoluta y >> archivo.log 2>&1
✓
systemd timers - alternativa moderna cuando necesitas más recursos

Siguiente ruta:

Ruta 5 - Asistentes de IA: ya dominas la terminal, el deploy, el servidor y la automatización. Ahora es hora de poner la IA a trabajar contigo.