Ghost AcademySecLearn// Seguridad Informática
⏰ Automatización · Programación de Tareas · Linux / Unix
Cron & Crontab
// Automatizar tareas en Linux — demonio + archivo de configuración

Guía completa de Cron y Crontab para programar tareas automáticas en Linux: sintaxis, ejemplos, caracteres especiales, herramientas online, alternativas y gestión avanzada con impacto en rendimiento.

crontab -e · -l · -r · -u freshclam · @reboot · @daily · @weekly nice · cpulimit · MAILTO Anacron · Fcron · launchd (macOS)
⏰
Cron y Crontab: Dos Elementos Dependientes
Aunque se usan juntos, Cron y Crontab son dos cosas distintas. Son los encargados de que la programación de tareas repetitivas en Linux sea posible.
👻Cron — El Demonio

Proceso en segundo plano que se ejecuta desde que arranca el sistema. Comprueba cada minuto si existe alguna tarea (job) para ejecutar según la hora configurada.

Localización de inicio: /etc/rc.d/ o /etc/init.d

Archivos que revisa: /etc/crontab y /var/spool/cron

📄Crontab — El Archivo

Archivo de texto con formato especial diseñado para ser leído por Cron. Contiene la lista de todos los scripts a ejecutar.

Cada usuario tiene su propio crontab — almacenados en /var/spool/cron/crontabs/

Se edita con el comando: crontab -e

👻
¿Qué es Cron?
Demonio que se ejecuta en segundo plano desde el arranque del sistema, verificando cada minuto si existe alguna tarea programada para ejecutar.

Es muy importante que la hora y zona horaria estén bien configuradas — de lo contrario los jobs se ejecutarán en horas incorrectas. Para verificarlo:

bash — verificar hora del sistema
# Verificar hora, zona horaria y sincronización NTP
timedatectl

# Configurar zona horaria si es incorrecta
timedatectl set-timezone Europe/Madrid

# Verificar estado del servicio cron
systemctl status cron

# Iniciar cron si no está activo
sudo systemctl start cron

# Habilitarlo para que inicie con el sistema
sudo systemctl enable cron
Salida de timedatectl mostrando hora y zona horaria sincronizada con NTP
Salida de timedatectl — hora sincronizada con NTP, zona horaria correcta
💡 NTP: La sincronización automática con servidores NTP garantiza que Cron ejecute los jobs en el momento exacto. Si falla, configura el servicio en /etc/ntp.conf.
📄
¿Qué es Crontab?
Archivo de texto con formato especial leído por Cron. Cada usuario tiene el suyo propio — todos pueden programar tareas independientemente sin necesitar al administrador.

La sintaxis de Crontab tiene cinco campos de tiempo más el comando a ejecutar. Su nombre viene de la palabra griega Kronos (tiempo), que es precisamente la clave de su funcionamiento.

📐
Sintaxis de Crontab
Cinco campos de tiempo + comando. Cada asterisco puede sustituirse por un valor específico o combinaciones con caracteres especiales.
*m · minuto
*h · hora
*dom · día mes
*mon · mes
*dow · día sem
usuariousuario
/ruta/scriptcomando
Minuto
0 – 59
Hora
0 – 23
Día mes
1 – 31
Mes
1 – 12
Día semana
0 – 6 (0=domingo)
también: Mon, Tue...
* (asterisco)
= cualquier valor
Estructura del archivo crontab con 5 asteriscos y el comando
Estructura de crontab — 5 campos de tiempo + usuario + comando
🔖
Cadenas Especiales (Atajos)
Palabras clave predefinidas que sustituyen a los 5 campos numéricos para los intervalos más comunes.
@reboot
— una sola vez
Se ejecuta una vez nada más iniciar el equipo
@yearly
0 0 1 1 *
Una vez al año (también @annually)
@monthly
0 0 1 * *
Una vez al mes, el primer día
@weekly
0 0 * * 0
Primer minuto de la primera hora de la semana
@daily
0 0 * * *
Todos los días a medianoche
@midnight
0 0 * * *
Equivalente exacto a @daily
@hourly
0 * * * *
Durante el primer minuto de cada hora
✳️
Caracteres Especiales en Crontab
Modificadores que amplían enormemente las posibilidades de definir cuándo ejecutar una tarea.
*
Comodín
Equivale a todos los valores del campo. Ejemplo: * * * * * = cada minuto.
,
Lista
Define múltiples valores separados por comas. Ejemplo: 1,15,30 = minutos 1, 15 y 30.
-
Rango
Establece un rango continuo. Ejemplo: 1-5 = del lunes al viernes (días 1 a 5).
/
Cada N
Significa cada. Ejemplo: */10 en minutos = cada 10 minutos.
#
Comentario
Las líneas que empiezan con # son ignoradas. Útil para documentar las tareas.
?
Excepción
En combinación rango/excep: crea excepciones en la regla. Limita el rango con exclusiones.
📝
Crear un Script para Cron
Antes de programar una tarea, crea el script y dale permisos de ejecución — sin esto, Cron no podrá ejecutarlo.
1
Crear el script con nano
nano consulta.sh — abre el editor en el directorio donde quieres guardar el script.
2
Escribir el contenido del script
Siempre empezar con el shebang #!/bin/bash para indicar el intérprete.
3
Dar permisos de ejecución
chmod +x consulta.sh o chmod ugo+x consulta.sh — esencial o Cron no podrá ejecutarlo.
4
Probar manualmente
./consulta.sh — verificar que funciona antes de añadirlo al crontab.
5
Añadir al crontab
crontab -e — editar el crontab del usuario actual y añadir la tarea.
bash — script de ejemplo (consulta.sh)
#!/bin/bash
# Script de ejemplo
# Lista el contenido del directorio raíz y guarda en archivo

sudo ls -l / > archivoResultado.txt
bash — dar permisos y probar
# Dar permisos de ejecución
chmod +x consulta.sh
# O bien: chmod ugo+x consulta.sh

# Probar el script manualmente
./consulta.sh

# Ver el resultado
cat archivoResultado.txt
⚠️ Permisos: Sin chmod +x el script nunca será ejecutado por Cron. Es uno de los errores más comunes al configurar tareas automáticas.
💡
Ejemplos de Crontab
Ejemplos prácticos con la sintaxis completa de 5 campos + usuario + comando.
Expresión CrontabCuándo se ejecuta
00 19 * * * usuario /ruta/script.shTodos los días a las 19:00 h
00 19 * * 0 usuario /ruta/script.shTodos los domingos a las 19:00 h
00 19 4 2 * usuario /ruta/script.shEl 4 de febrero a las 19:00 h
*/10 * * * * usuario /ruta/script.shCada 10 minutos
0 9-18 * * 1-5 usuario /ruta/script.shCada hora, de 9 a 18h, de lunes a viernes
0 0 1,15 * * usuario /ruta/script.shA medianoche el día 1 y 15 de cada mes
@reboot usuario /ruta/script.shUna vez al arrancar el sistema
@daily usuario /ruta/script.shTodos los días a medianoche
crontab -e — editar tareas del usuario
# Todos los días a las 19:00
00 19 * * * usuario /ubicacion/del/script/consulta.sh

# Todos los domingos a las 19:00
00 19 * * 0 usuario /ubicacion/del/script/consulta.sh

# El 4 de febrero a las 19:00
00 19 4 2 * usuario /ubicacion/del/script/consulta.sh

# Cada 10 minutos (cualquier hora, cualquier día)
*/10 * * * * usuario /ubicacion/del/script/script.sh

# Con MAILTO para notificaciones por correo si hay errores
MAILTO="tu.correo@ejemplo.com"
0 19 * * * usuario /ubicacion/del/script/script.sh
💻
Comandos de Administración de Crontab
Todos los subcomandos de crontab para gestionar jobs del usuario.
crontab -e
Editar el archivo crontab del usuario actual en el editor predeterminado
crontab -l
Listar todas las tareas existentes en el crontab del usuario
crontab -r
Borrar el crontab completo de forma permanente ⚠️
crontab -d
Borrar el crontab que está configurado actualmente
crontab -u usuario
Manejar el crontab de otro usuario del sistema (requiere permisos)
crontab archivo
Reemplazar el crontab existente con el contenido del archivo indicado
crontab -c dir
Definir el directorio donde se almacena el archivo crontab
crontab -l > backup.txt
Exportar crontab a archivo de respaldo. Restaurar con: crontab backup.txt
🗂️
Tipos de Archivos de Configuración Cron
Dos tipos de crontab con distintos niveles de privilegio y alcance.
🔐Crontab del Sistema

Requiere privilegios de root. Se usa para servicios del sistema o trabajos críticos. Incluye un campo extra con el nombre de usuario con el que ejecutar el comando.

Editado con: sudo crontab -e

👤Crontab de Usuario

Cada usuario puede instalar sus propios jobs con crontab -e. Solo puede ser lanzado por el usuario que creó el crontab.

Almacenados en: /var/spool/cron/crontabs/

🔧
Herramientas Online para Cron
Generadores y validadores de expresiones cron sin necesidad de instalación ni registro.
Crontab Guru
Editor rápido con alertas en tiempo real sobre errores. Muestra ejemplos comunes y consejos. La herramienta más popular.
crontab.guru
Cron Job Generator
Crea y programa secuencias de comandos con ajustes preconfigurados e intervalos de tiempo. Personalizable.
crontab-generator.org
EasyCron
Programa llamadas a URLs, panel de usuario, registros de ejecución, notificaciones por correo y filtros de log.
easycron.com
KCron (KDE)
Interfaz gráfica para entorno KDE. Crea, modifica y elimina tareas sin tocar el archivo crontab directamente.
CronMaker
Basado en la biblioteca Quartz. Crea expresiones cron avanzadas online sin descarga.
cronmaker.com
📋
Logs de Cron
Cron guarda logs de todas las ejecuciones — útil para depurar tareas fallidas.
bash — consultar logs de cron
# Logs generales del sistema (incluye cron)
cat /var/log/syslog | grep CRON

# Ver en tiempo real
tail -f /var/log/syslog | grep CRON

# Guardar salida de un job en log propio
0 19 * * * usuario /ruta/script.sh >> /var/log/mi_cron.log 2>&1
📌 Archivo de log: Por defecto en /var/log/syslog. Se guardan todas las ejecuciones de cron, no solo las del usuario. Usa grep CRON para filtrar.
⚡
Impacto en Rendimiento
Demasiadas tareas programadas pueden afectar negativamente al sistema. Hay que ser consciente de los efectos.
CPU
Picos de consumo
Tareas pesadas simultáneas causan picos de CPU y RAM que pueden degradar el rendimiento.
🌐
Sobrecarga en red
Transferencias de datos programadas ocupan ancho de banda, aumentan latencia y ping.
⚔️
Conflicto de tareas
Dos tareas simultáneas sobre el mismo archivo pueden generar conflictos y corrupción.

Limitar recursos de una tarea con nice y cpulimit

crontab — limitar prioridad de CPU
# Ejecutar con baja prioridad de CPU (nice -n 19 = prioridad mínima)
0 19 * * * usuario nice -n 19 /ubicacion/del/script/script.sh

# Limitar uso de CPU al 50% con cpulimit
0 19 * * * usuario cpulimit -l 50 /ubicacion/del/script/script.sh
💡 Buenas prácticas: Programa actualizaciones y tareas pesadas en horarios de baja actividad (madrugada). Escala tareas complejas para que no se solapen. Monitoriza con scripts de CPU/RAM/disco.
🔄
Alternativas a Cron y Crontab
Para casos donde Cron se queda corto — sistemas que se apagan, mayor flexibilidad o entornos Windows/macOS.
Anacron (Linux)
No requiere que el equipo esté siempre encendido. Si estaba apagado cuando debía ejecutarse, lo hace al encenderse. Disponible en muchos paquetes Linux.
Fcron (Linux)
Tampoco requiere equipo encendido. Puede trabajar con hora y minuto específicos. Instalación desde código fuente.
hcron (Linux)
Soporta etiquetas para organizar trabajo, administración de red y archivos de usuario. Mejora la seguridad respecto a cron.
Mcron (Linux)
Permite redefinir la programación de tareas mediante reconstrucción desde un punto inicial. Instalación sencilla.
launchd (macOS)
Sistema de administración de servicios en macOS. Mayor flexibilidad, mejor integración con el SO. Apple lo recomienda sobre cron. Usa archivos .plist.
WinCron / VisualCron (Windows)
Alternativas de Cron para Windows con interfaz gráfica. También Advanced Task Scheduler para usuarios no expertos.
🍎 launchd vs cron en macOS: launchd ofrece reinicio de tareas fallidas, condiciones complejas, manejo de errores y mayor precisión con StartCalendarInterval. Apple lo recomienda como sustituto oficial de cron.
❓
Preguntas Frecuentes
Respuestas a las dudas más habituales al trabajar con Cron y Crontab.
¿Cómo saber si Cron está activo en el sistema?
Ejecuta systemctl status cron. Si aparece active (running) está funcionando. Para iniciarlo: sudo systemctl start cron. Para que inicie al arrancar: sudo systemctl enable cron.
¿Puedo programar tareas con intervalos no estándar?
Sí. Usa el operador / para intervalos. Ejemplo cada 10 minutos: */10 * * * * usuario /ruta/script.sh. También puedes combinar con rangos: */15 9-18 * * 1-5 = cada 15 min de 9 a 18h los días laborables.
¿Qué pasa si un script programado produce un error?
Cron envía la salida y errores al correo local. Para notificaciones externas, añade al crontab: MAILTO="tu.correo@ejemplo.com" antes de la tarea. También puedes redirigir errores a log: /ruta/script.sh >> /var/log/mi_cron.log 2>&1
¿Cómo limitar los recursos que consume una tarea?
Cron no limita recursos directamente. Usa nice para prioridad de CPU: nice -n 19 /ruta/script.sh (19 = prioridad mínima). Usa cpulimit para limitar porcentaje: cpulimit -l 50 /ruta/script.sh (50% CPU máximo).
¿Cómo hacer backup del crontab?
Exporta con: crontab -l > ~/crontab_backup.txt. Guarda el archivo en lugar seguro. Para restaurar: crontab ~/crontab_backup.txt. Recomendado hacerlo antes de cualquier modificación importante.
🚀
Ejemplo Completo: Log al Arrancar con @reboot
Cada vez que Ubuntu arranca, escribe la fecha y hora en ~/programas.txt. Ejemplo completo y reproducible.
1
Crear el script en /usr/local/bin/
Ubícalo en /usr/local/bin/ para que sea accesible desde cualquier lugar del sistema.
2
Dar permisos de ejecución
sudo chmod +x /usr/local/bin/log_programa.sh
3
Editar el crontab del sistema
sudo crontab -e y añadir la línea @reboot /usr/local/bin/log_programa.sh al final.
4
Guardar en nano
Ctrl+O → Enter → Ctrl+X. Verás: "crontab: installing new crontab"
5
Reiniciar y verificar
sudo reboot y después cat ~/programas.txt para ver las entradas.
bash — crear el script
sudo nano /usr/local/bin/log_programa.sh
log_programa.sh — contenido
#!/bin/bash
# Script que registra la fecha y hora de inicio del sistema

OUT="/home/jose/programas.txt"  # cambia 'jose' por tu usuario real

echo "Programa emitido el: $(date '+%Y-%m-%d %H:%M:%S')" >> "$OUT"
bash — permisos y configurar cron
# Dar permisos de ejecución
sudo chmod +x /usr/local/bin/log_programa.sh

# Editar crontab del sistema (root)
sudo crontab -e

# Añadir al final del archivo crontab:
@reboot /usr/local/bin/log_programa.sh

# Reiniciar el sistema
sudo reboot

# Tras iniciar sesión, verificar el archivo
cat ~/programas.txt
✅ Salida esperada: Cada reinicio añade una línea nueva al archivo:
Programa emitido el: 2025-09-30 16:45:12
Programa emitido el: 2025-09-30 17:10:47
⚠️ Verificar la ruta: Asegúrate de que /home/jose/ existe antes de reiniciar. Si el directorio no existe o el script se ejecuta como root, el archivo puede no crearse en el lugar esperado. Usa la ruta absoluta correcta de tu usuario.