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.
🧠 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.
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 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.
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.
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.
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.
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.
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)
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>&1enví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í.
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
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.