Ghost AcademySecLearn// Seguridad Informática
⏰ Linux · Automatización · Tareas programadas
Crontab —
Programando Tareas en Linux

El demonio cron ejecuta scripts y comandos en intervalos regulares. Crontab es su interfaz de administración, equivalente a las Tareas Programadas de Windows.

crontab -ecrontab -l@reboot @daily@weeklybackup */15 * * * *cron

¿Qué es cron y crontab?

En sistemas Unix/Linux, cron es un demonio (proceso en segundo plano) que ejecuta comandos o scripts a intervalos regulares. El nombre viene del griego chronos (χρόνος), «tiempo».

Crontab es el fichero de texto donde se definen todas las tareas programadas. Cada usuario del sistema tiene su propio fichero crontab. El ubicado en /etc/ pertenece al usuario root.

ℹ️ Cron ≈ Tareas Programadas de Windows: Si conoces las Tareas Programadas de Windows, cron cumple exactamente la misma función en Linux: ejecutar scripts o comandos de forma automática en el momento que tú decidas.
crontab -l — Sin tareas programadas aún
crontab -l sin tareas

Comandos Básicos de Crontab

ComandoAcción
crontab -lListar las tareas programadas del usuario actual.
sudo crontab -lListar las tareas del usuario root.
crontab -eEditar el fichero crontab. Abre el editor definido en $EDITOR.
crontab -rBorrar todo el crontab del usuario actual.
crontab -u usuarioOperar sobre el crontab de otro usuario (requiere sudo).
Elegir editor antes de editar
bash
export EDITOR="nano"   # usar nano como editor
export EDITOR="vim"    # o vim si lo prefieres
bash — Abrir el fichero crontab para editar
sudo crontab -e
crontab -e — Selección de editor
Selección de editor al abrir crontab -e
Fichero crontab abierto en nano — desplazarse al final para editar
Fichero crontab en nano

Estructura de una Línea Crontab

Cada tarea ocupa una línea con exactamente 6 campos: cinco de tiempo y uno con el comando a ejecutar.

*Minuto
*Hora
*Día mes
*Mes
*Día semana
/ruta/comandoComando
Minuto (0-59)
Hora (0-23)
Día del mes (1-31)
Mes (1-12)
Día semana (0=Dom … 6=Sáb)
Diagrama oficial de la sintaxis de crontab
Diagrama de sintaxis de crontab
💡 El asterisco * es el comodín universal — significa «todos los valores posibles». Por ejemplo, * en el campo Hora significa «a todas las horas».

Campos y Valores Válidos

CampoRangoOperadoresEjemplo
Minuto 0–59 * , - / 30 → al minuto 30 · */15 → cada 15 min
Hora 0–23 * , - / 9 → a las 9 AM · 9-17 → de 9 a 17
Día del mes 1–31 * , - / 1 → el día 1 · 1,15 → días 1 y 15
Mes 1–12 * , - / 12 → diciembre · */6 → cada 6 meses
Día semana 0–7 (0 y 7 = Dom) * , - / 1-5 → lunes a viernes · 5 → viernes

Operadores especiales

OperadorSignificadoEjemplo
*Cualquier valor (comodín)* * * * * → cada minuto
,Lista de valores10,14,18 → a las 10, 14 y 18 h
-Rango de valores1-5 → lunes a viernes
/Intervalo (cada N)*/15 → cada 15 minutos

Cadenas Especiales (Shorthands)

Estas palabras reservadas reemplazan los cinco campos de tiempo para los usos más comunes. Se ponen en la posición del primer campo.

@reboot
≡ una vez al inicio
Se ejecuta una vez cada vez que el sistema arranca.
@hourly
≡ 0 * * * *
Se ejecuta al inicio de cada hora (minuto 0).
@daily
≡ 0 0 * * *
Una vez al día, a medianoche (00:00).
@midnight
≡ @daily
Alias de @daily. Exactamente igual.
@weekly
≡ 0 0 * * 0
Una vez a la semana, a medianoche del domingo.
@monthly
≡ 0 0 1 * *
Una vez al mes, el día 1 a medianoche.
@yearly
≡ 0 0 1 1 *
Una vez al año, el 1 de enero a medianoche.
@annually
≡ @yearly
Alias de @yearly. Exactamente igual.

Ejemplo práctico con @reboot

Registrar la fecha y hora de cada inicio del equipo en un archivo de log:

crontab — Registrar inicios del sistema
@reboot date >> /home/jose/inicios.txt
Crontab con @reboot editado en nano
Crontab con @reboot en nano
Guardando el crontab con Ctrl+O en nano
Guardando crontab con Ctrl+O
💡 Detectar accesos no autorizados: El truco del @reboot date >> inicios.txt es muy útil para saber si alguien ha encendido tu equipo cuando no estabas. Cada arranque queda registrado con fecha y hora exactas.

Ejemplos — Frecuencia Básica

La sintaxis básica es: Minuto Hora DíaMes Mes DíaSemana Comando

ExpresiónDescripción
* * * * * /ruta/cmdCada minuto. El asterisco en todas las posiciones.
0 * * * * /ruta/cmdCada hora — al minuto 0 de cada hora.
0 9 * * * /ruta/cmdTodos los días a las 9:00 AM.
0 0 * * * /ruta/cmdTodas las noches a medianoche (00:00).

Ejemplo clásico — Actualizar el sistema a medianoche

crontab
00 00 * * * root apt-get update && apt-get -y upgrade
# Equivalente con shorthand:
@daily root apt-get update && apt-get -y upgrade

Ejemplos — Rangos y Listas

Usa la coma , para listar valores y el guion - para rangos.

ExpresiónDescripción
0 10,14,18 * * * /cmdTres veces al día: a las 10:00, 14:00 y 18:00 h.
0 9-17 * * * /cmdCada hora de 9 AM a 5 PM (horario laboral).
30 1 * * 1-5 /cmdDe lunes a viernes a la 1:30 AM. (1=Lun, 5=Vie)
0 12 1,15 * * /cmdLos días 1 y 15 de cada mes a las 12:00 PM.

Ejemplos — Intervalos

Usa la barra diagonal / para indicar «cada N unidades de tiempo».

ExpresiónDescripción
*/15 * * * * /cmdCada 15 minutos (minutos 0, 15, 30, 45).
0 */4 * * * /cmdCada 4 horas (a las 0, 4, 8, 12, 16, 20 h).
0 0 1 */6 * /cmdCada 6 meses, el día 1 a medianoche.

Ejemplos — Fechas y Días Específicos

ExpresiónDescripción
0 2 1 * * /cmdEl primer día de cada mes a las 2:00 AM.
0 10 * * 5 /cmdTodos los viernes a las 10:00 AM. (5 = Viernes)
0 3 * 12 0 /cmdSolo en diciembre, todos los domingos a las 3:00 AM. (12=Dic, 0=Dom)
🗓️ Tabla de días de la semana: 0 o 7 = Domingo · 1 = Lunes · 2 = Martes · 3 = Miércoles · 4 = Jueves · 5 = Viernes · 6 = Sábado

Casos de Uso — Registro con echo

Usando echo para escribir mensajes en un archivo de log, ideal para comprobar que cron funciona correctamente.

Expresión CrontabDescripción
*/5 * * * * echo "Cada 5 min" >> /tmp/cron-log.txt Cada 5 minutos añade una línea al archivo de registro.
30 14 10 * * echo "Día 10" >> /tmp/cron-log.txt El día 10 de cada mes a las 14:30, registra un recordatorio.
0 8 * * 1-5 echo "Inicio jornada" >> /tmp/cron-log.txt De lunes a viernes a las 8:00 AM, registra el inicio de jornada.

Casos de Uso — Script de Backup

El verdadero potencial de cron se despliega combinándolo con scripts de shell. Primero hay que crear el script y darle permisos de ejecución.

El script backup_diario.sh

bash — Crear el script
sudo nano /home/jose/scripts/backup_diario.sh
bash — Contenido del script
#!/bin/bash
FECHA=$(date +\%Y\%m\%d)
tar -czf /backups/copia_$FECHA.tar.gz /home/jose/Documentos 2>&1
echo "Copia de seguridad $FECHA completada." >> /var/log/backup.log
⚠️ Nota sobre % en crontab: En una entrada de crontab, el carácter % se interpreta como salto de línea. Cuando lo uses dentro de un comando crontab (no en un script externo), debes escaparlo como \%. Si el comando está en un script .sh separado, esto no aplica.
DAR PERMISOS de ejecución al script (¡imprescindible!)
bash
chmod ugo+x /home/jose/scripts/backup_diario.sh
⚠️ Muy importante: Sin el bit de ejecución (chmod +x), cron intentará ejecutar el script pero fallará silenciosamente. El script nunca se ejecutará hasta que tenga permisos correctos.

Entradas crontab para el backup

Expresión CrontabDescripción
0 3 * * * /home/jose/scripts/backup_diario.sh Cada noche a las 3:00 AM. Ideal para backups diarios de mantenimiento.
0 20 * * 5 /home/jose/scripts/backup_diario.sh Todos los viernes a las 20:00 h. Backup semanal.
30 0 1 * * /home/jose/scripts/backup_diario.sh El primer día de cada mes a las 00:30 AM. Backup mensual.

Añadir Tareas a Crontab — Paso a Paso

  1. Abre el crontab de tu usuario: crontab -e
  2. Desplázate al final del fichero con las teclas de cursor.
  3. Pega o escribe la línea de la tarea deseada.
  4. En nano: guarda con Ctrl+O, confirma con Enter, sal con Ctrl+X. Crontab se activa automáticamente al guardar.
🌐 Herramienta online: Si la sintaxis te resulta confusa al principio, puedes usar crontab-generator.org para generar expresiones crontab de forma visual y copiarlas directamente en tu fichero.

Borrar todo el crontab

bash
crontab -r   # Elimina TODAS las tareas del usuario actual
⚠️ crontab -r borra todo el fichero sin confirmación. Si solo quieres eliminar una tarea concreta, usa crontab -e y borra la línea manualmente.