107.2 - Teoria: Automatizar tareas de administracion

1. Cron - Tareas programadas recurrentes

Que es cron

Cron es el daemon que ejecuta tareas programadas de forma recurrente (periodica). El daemon crond (o cron) se ejecuta en segundo plano y revisa cada minuto si hay tareas que deban ejecutarse.

Formato del crontab

Cada linea de un crontab define una tarea programada con el siguiente formato:

* * * * * comando
| | | | |
| | | | +--- Dia de la semana (0-7, donde 0 y 7 = domingo)
| | | +----- Mes (1-12)
| | +------- Dia del mes (1-31)
| +--------- Hora (0-23)
+----------- Minuto (0-59)

Valores especiales en los campos

SimboloSignificadoEjemplo
*Cualquier valor* * * * * = cada minuto
,Lista de valores1,15,30 * * * * = minutos 1, 15 y 30
-Rango de valores1-5 * * * * = minutos 1 a 5
/Incremento (cada N)*/15 * * * * = cada 15 minutos

Ejemplos de programacion

# Cada minuto
* * * * * /ruta/script.sh
 
# Todos los dias a las 2:30 AM
30 2 * * * /ruta/backup.sh
 
# Lunes a viernes a las 8:00 AM
0 8 * * 1-5 /ruta/informe.sh
 
# El dia 1 de cada mes a medianoche
0 0 1 * * /ruta/mensual.sh
 
# Cada 15 minutos
*/15 * * * * /ruta/monitoreo.sh
 
# Domingos a las 3:00 AM
0 3 * * 0 /ruta/mantenimiento.sh
 
# Cada hora en punto
0 * * * * /ruta/cada_hora.sh
 
# Lunes y miercoles a las 14:30
30 14 * * 1,3 /ruta/tarea.sh

Cadenas especiales (atajos)

CadenaEquivalenteSignificado
@reboot-Al iniciar el sistema
@yearly / @annually0 0 1 1 *Una vez al ano (1 enero)
@monthly0 0 1 * *Una vez al mes (dia 1)
@weekly0 0 * * 0Una vez a la semana (domingo)
@daily / @midnight0 0 * * *Una vez al dia (medianoche)
@hourly0 * * * *Una vez por hora

2. Crontab de usuario vs crontab del sistema

Crontab de usuario

Cada usuario puede tener su propio crontab. Los archivos se almacenan en /var/spool/cron/crontabs/ (Debian) o /var/spool/cron/ (Red Hat).

# Editar el crontab del usuario actual
crontab -e
 
# Listar el crontab del usuario actual
crontab -l
 
# Eliminar el crontab del usuario actual
crontab -r
 
# Editar el crontab de otro usuario (solo root)
crontab -e -u sandra
 
# Listar el crontab de otro usuario (solo root)
crontab -l -u sandra

Formato del crontab de usuario (5 campos + comando):

min hora dia mes dia_sem comando
30  2    *   *   *       /home/sandra/backup.sh

Crontab del sistema: /etc/crontab

El crontab del sistema tiene un campo extra: el nombre del usuario que ejecutara el comando.

Formato de /etc/crontab (6 campos + comando):

min hora dia mes dia_sem USUARIO comando
30  2    *   *   *       root    /usr/local/bin/backup.sh
# Ejemplo de /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
 
# min hora dia mes dia_sem usuario comando
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

IMPORTANTE para el examen: La diferencia clave entre el crontab de usuario y el del sistema es el campo de usuario extra en el del sistema.

Directorio /etc/cron.d/

Contiene archivos crontab adicionales del sistema. Cada archivo tiene el mismo formato que /etc/crontab (con campo de usuario). Es util para paquetes de software que necesitan programar tareas.

Directorios cron.{hourly,daily,weekly,monthly}

Son directorios que contienen scripts ejecutables (no crontabs). Se ejecutan automaticamente con la periodicidad indicada:

DirectorioFrecuencia
/etc/cron.hourly/Cada hora
/etc/cron.daily/Una vez al dia
/etc/cron.weekly/Una vez a la semana
/etc/cron.monthly/Una vez al mes
  • Los scripts deben tener permiso de ejecucion
  • Se ejecutan mediante run-parts (ejecuta todos los scripts de un directorio)
  • NO tienen formato crontab; son scripts normales

3. Control de acceso a cron

Logica de /etc/cron.allow y /etc/cron.deny

El acceso de usuarios a cron se controla con dos archivos:

SituacionQuien puede usar cron
/etc/cron.allow existeSOLO los usuarios listados en cron.allow
/etc/cron.allow NO existe, /etc/cron.deny existeTodos los usuarios EXCEPTO los listados en cron.deny
Ninguno de los dos existeDepende de la distribucion (generalmente solo root)
Ambos existencron.allow tiene prioridad

IMPORTANTE para el examen: Si cron.allow existe, cron.deny se ignora. cron.allow siempre tiene prioridad.

# Solo sandra y carlos pueden usar cron
echo "sandra" > /etc/cron.allow
echo "carlos" >> /etc/cron.allow
 
# Todos pueden usar cron excepto ana
echo "ana" > /etc/cron.deny
 
# Todos pueden usar cron (deny vacio)
> /etc/cron.deny    # Crear archivo vacio

4. Anacron - Para sistemas que no estan siempre encendidos

Que es anacron

Anacron es un complemento de cron para sistemas que NO estan encendidos las 24 horas (laptops, estaciones de trabajo). Si una tarea programada no se ejecuto porque el sistema estaba apagado, anacron la ejecuta cuando el sistema se encienda.

Diferencias con cron

Aspectocronanacron
Precision minimaMinutosDias
Requiere sistema encendidoSiNo (ejecuta tareas perdidas)
Se ejecuta comoDaemon permanenteInvocado por cron o al inicio
Quien lo usaCualquier usuarioSolo root

/etc/anacrontab

# Formato: periodo retardo identificador comando
# periodo: dias entre ejecuciones
# retardo: minutos de espera antes de ejecutar
# identificador: nombre unico para registro
# comando: comando a ejecutar
 
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
RANDOM_DELAY=45
START_HOURS_RANGE=3-22
 
1   5   cron.daily      nice run-parts /etc/cron.daily
7   25  cron.weekly     nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
CampoDescripcion
periodoFrecuencia en dias (1 = diario, 7 = semanal, @monthly)
retardoMinutos de espera adicional antes de ejecutar
identificadorNombre unico (usado para el timestamp en /var/spool/anacron/)
comandoComando a ejecutar

Variables especiales:

  • RANDOM_DELAY: Retardo aleatorio adicional (en minutos)
  • START_HOURS_RANGE: Rango de horas en que anacron puede ejecutar tareas

Anacron registra la ultima ejecucion en /var/spool/anacron/. Al iniciar, compara la fecha actual con la ultima ejecucion para decidir si debe ejecutar la tarea.


5. at - Tareas unicas programadas

Que es at

at ejecuta un comando una sola vez en un momento especifico del futuro (a diferencia de cron que es recurrente).

Uso de at

# Programar una tarea para las 3:00 PM
at 15:00
> /usr/local/bin/backup.sh
> <Ctrl+D>
 
# Programar para manana a las 2:30 AM
at 02:30 tomorrow
 
# Programar para una fecha especifica
at 14:00 2026-12-25
 
# Programar para dentro de 2 horas
at now + 2 hours
 
# Programar para dentro de 30 minutos
at now + 30 minutes
 
# Programar para dentro de 3 dias
at now + 3 days
 
# Leer comandos desde un archivo
at 15:00 -f /ruta/comandos.txt

Especificaciones de tiempo en at

at acepta una variedad de formatos para especificar el momento de ejecucion:

FormatoEjemploDescripcion
Hora HH:MMat 14:30A las 14:30 del dia actual (o siguiente si ya paso)
Hora 12hat 2:30 PMA las 2:30 PM
noonat noonA las 12:00 del mediodia
midnightat midnightA las 00:00 de la medianoche
teatimeat teatimeA las 16:00 (4:00 PM)
now + N minat now + 30 minutesDentro de 30 minutos
now + N hoursat now + 2 hoursDentro de 2 horas
now + N daysat now + 3 daysDentro de 3 dias
now + N weeksat now + 1 weekDentro de 1 semana
tomorrowat 10:00 tomorrowManana a las 10:00
Fecha con mesat 2:30 PM January 1515 de enero a las 2:30 PM
Fecha ISOat 14:00 2026-12-3131 de diciembre de 2026 a las 14:00
Hora + mes diaat 10:00 AM Jul 44 de julio a las 10:00 AM

Para el examen: Recordar las palabras clave especiales: noon (12:00), midnight (00:00), teatime (16:00), tomorrow, y el formato now + N unidad.

Comandos relacionados

ComandoDescripcion
at horaProgramar una tarea
atqListar tareas pendientes (= at -l)
atrm IDEliminar una tarea por su ID (= at -d ID)
batchEjecutar cuando la carga del sistema sea baja (< 0.8 por defecto)
# Ver tareas programadas
atq
# 1    Tue May 26 15:00:00 2026 a sandra
 
# Eliminar tarea numero 1
atrm 1

Control de acceso a at

La logica es identica a la de cron:

SituacionQuien puede usar at
/etc/at.allow existeSOLO los usuarios listados
/etc/at.allow NO existe, /etc/at.deny existeTodos EXCEPTO los listados en at.deny
Ninguno existeDepende de la distribucion

6. Systemd timers - Alternativa moderna a cron

Que son los timers de systemd

Los timers de systemd son una alternativa a cron integrada en systemd. Un timer es una unidad (.timer) que activa otra unidad (.service) en momentos programados.

Estructura

Se necesitan dos archivos:

  1. Archivo .timer - Define cuando se ejecuta
  2. Archivo .service - Define que se ejecuta

Ejemplo de timer

/etc/systemd/system/backup.timer:

[Unit]
Description=Backup diario
 
[Timer]
OnCalendar=daily
# O con formato detallado:
# OnCalendar=*-*-* 02:30:00
Persistent=true
 
[Install]
WantedBy=timers.target

/etc/systemd/system/backup.service:

[Unit]
Description=Ejecutar backup
 
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh

Opciones de programacion del timer

OpcionDescripcionEjemplo
OnCalendarTiempo basado en calendariodaily, weekly, *-*-* 02:30:00
OnBootSecTiempo despues del arranque15min
OnUnitActiveSecTiempo despues de la ultima activacion1h
OnActiveSecTiempo despues de la activacion del timer30s
PersistentEjecutar si se perdio la ejecucion (como anacron)true

Formato OnCalendar

DiaSem Ano-Mes-Dia Hora:Min:Seg

# Ejemplos:
daily                    # Todos los dias a medianoche
weekly                   # Cada lunes a medianoche
monthly                  # Dia 1 de cada mes a medianoche
*-*-* 02:30:00          # Todos los dias a las 2:30
Mon *-*-* 08:00:00      # Lunes a las 8:00
*-*-01 00:00:00         # Dia 1 de cada mes a medianoche

Gestion de timers

# Listar todos los timers activos
systemctl list-timers
systemctl list-timers --all
 
# Habilitar y arrancar un timer
systemctl enable backup.timer
systemctl start backup.timer
 
# Ver estado de un timer
systemctl status backup.timer
 
# Verificar la proxima ejecucion
systemd-analyze calendar daily
systemd-analyze calendar "*-*-* 02:30:00"

Ventajas de timers sobre cron

Aspectocronsystemd timers
LogsSalida por emailIntegrado en journal (journalctl)
DependenciasNo soportaSoporta dependencias de unidades
RecuperacionNo (necesita anacron)Persistent=true
Controlcrontabsystemctl (start/stop/enable/disable)
Precision1 minutoHasta microsegundos

7. systemd-run - Tareas unicas con systemd

systemd-run permite ejecutar un comando como una unidad transitoria de systemd, incluyendo la posibilidad de programar su ejecucion para un momento futuro. Es una alternativa moderna a at integrada en systemd.

Ejecucion inmediata

# Ejecutar un comando como unidad transitoria
systemd-run /usr/local/bin/backup.sh
 
# Con nombre descriptivo
systemd-run --unit=mi-backup --description="Backup manual" /usr/local/bin/backup.sh

Ejecucion programada (alternativa a at)

# Ejecutar dentro de 30 segundos
systemd-run --on-active=30s /bin/comando
 
# Ejecutar dentro de 5 minutos
systemd-run --on-active=5m /usr/local/bin/tarea.sh
 
# Ejecutar dentro de 2 horas
systemd-run --on-active=2h /usr/local/bin/proceso.sh
 
# Ejecutar en una fecha y hora especifica (formato OnCalendar)
systemd-run --on-calendar="2026-12-31 23:59:00" /usr/local/bin/fin-de-anio.sh
 
# Ejecutar todos los dias a las 3:00 AM (como un cron transitorio)
systemd-run --on-calendar="*-*-* 03:00:00" --timer-property=Persistent=true /usr/local/bin/diario.sh

Opciones principales de systemd-run

OpcionDescripcion
--on-active=TIEMPOEjecutar despues de un tiempo relativo (ej: 30s, 5m, 2h)
--on-calendar=CALENDARIOEjecutar en un momento especifico o patron de calendario
--on-boot=TIEMPOEjecutar N tiempo despues del arranque
--unit=NOMBRENombre de la unidad transitoria
--description=DESCDescripcion de la unidad
--timer-property=PROPPropiedades adicionales del timer

Ventajas sobre at

  • Integrado en systemd (no requiere el demonio atd)
  • Los logs se registran en el journal (consultables con journalctl)
  • Soporta dependencias y propiedades de unidades systemd
  • No necesita archivos allow/deny

Resumen para el examen

  1. Formato crontab de usuario: min hora dia mes dia_sem comando (5 campos + comando)
  2. Formato /etc/crontab: Igual pero con campo usuario extra (6 campos + comando)
  3. cron.allow tiene prioridad sobre cron.deny. Si allow existe, deny se ignora
  4. Si solo allow existe: solo los listados; si solo deny existe: todos menos los listados
  5. Anacron: Para sistemas no siempre encendidos. Precision minima: dias. Solo root
  6. /etc/anacrontab: periodo retardo identificador comando
  7. at: Tareas unicas. atq lista, atrm elimina, batch ejecuta con carga baja
  8. Tiempos especiales de at: noon (12:00), midnight (00:00), teatime (16:00), now + N units
  9. at.allow/at.deny: Misma logica que cron.allow/cron.deny
  10. systemd timers: Usan archivos .timer + .service. OnCalendar para programacion
  11. systemd-run: Tareas unicas con systemd. --on-active=30s para ejecucion relativa, --on-calendar para momento especifico
  12. systemctl list-timers para ver timers activos

Trampas del examen

Errores comunes y distinciones criticas que LPI suele evaluar en este subtema:

  • El campo 5 de crontab es dia de la semana (0-7, donde 0 Y 7 son domingo) — La confusion con mes/dia es una trampa clasica. El orden es: minuto, hora, dia del mes, mes, dia de la semana. Tanto 0 como 7 representan domingo
  • Crontab del sistema tiene campo USUARIO extra — El crontab de usuario tiene 5 campos + comando; /etc/crontab y archivos en /etc/cron.d/ tienen 6 campos + comando (incluyen el usuario). Olvidar el campo usuario al editar /etc/crontab causa errores
  • cron.allow tiene PRIORIDAD sobre cron.deny — Si /etc/cron.allow existe, SOLO los usuarios listados pueden usar cron (cron.deny se ignora completamente). Si solo existe cron.deny, todos pueden usar cron excepto los listados. La misma logica aplica a at.allow/at.deny
  • /etc/cron.daily/ contiene SCRIPTS, no lineas crontab — Los directorios cron.{hourly,daily,weekly,monthly} contienen scripts ejecutables normales, NO archivos con formato crontab. Se ejecutan con run-parts
  • Anacron tiene precision de DIAS, no minutos — Anacron no puede programar tareas para horas o minutos especificos. Solo garantiza que se ejecuten una vez cada N dias. Para precision por minutos, se usa cron
  • Anacron solo lo ejecuta ROOT — A diferencia de cron que cualquier usuario puede usar (si tiene permiso), anacron solo es para root. Los usuarios normales no tienen anacrontab
  • at teatime = 16:00 — Las palabras clave especiales de at incluyen noon (12:00), midnight (00:00) y teatime (16:00). El examen puede preguntar la hora equivalente a teatime
  • batch ejecuta cuando la carga es BAJAbatch no programa para un momento especifico, sino que ejecuta cuando la carga del sistema baja de 0.8 (por defecto). No confundir con at que ejecuta en un momento determinado
  • Systemd timers necesitan DOS archivos — Un .timer (cuando ejecutar) y un .service (que ejecutar). Si falta el .service, el timer no funciona. Persistent=true permite recuperar ejecuciones perdidas (como anacron)
  • systemd-run --on-active usa tiempo RELATIVOsystemd-run --on-active=30s ejecuta dentro de 30 segundos; --on-calendar usa tiempo absoluto. No confundir los formatos de tiempo de cada opcion