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
| Simbolo | Significado | Ejemplo |
|---|---|---|
* | Cualquier valor | * * * * * = cada minuto |
, | Lista de valores | 1,15,30 * * * * = minutos 1, 15 y 30 |
- | Rango de valores | 1-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.shCadenas especiales (atajos)
| Cadena | Equivalente | Significado |
|---|---|---|
@reboot | - | Al iniciar el sistema |
@yearly / @annually | 0 0 1 1 * | Una vez al ano (1 enero) |
@monthly | 0 0 1 * * | Una vez al mes (dia 1) |
@weekly | 0 0 * * 0 | Una vez a la semana (domingo) |
@daily / @midnight | 0 0 * * * | Una vez al dia (medianoche) |
@hourly | 0 * * * * | 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 sandraFormato 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:
| Directorio | Frecuencia |
|---|---|
/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:
| Situacion | Quien puede usar cron |
|---|---|
/etc/cron.allow existe | SOLO los usuarios listados en cron.allow |
/etc/cron.allow NO existe, /etc/cron.deny existe | Todos los usuarios EXCEPTO los listados en cron.deny |
| Ninguno de los dos existe | Depende de la distribucion (generalmente solo root) |
| Ambos existen | cron.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 vacio4. 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
| Aspecto | cron | anacron |
|---|---|---|
| Precision minima | Minutos | Dias |
| Requiere sistema encendido | Si | No (ejecuta tareas perdidas) |
| Se ejecuta como | Daemon permanente | Invocado por cron o al inicio |
| Quien lo usa | Cualquier usuario | Solo 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| Campo | Descripcion |
|---|---|
| periodo | Frecuencia en dias (1 = diario, 7 = semanal, @monthly) |
| retardo | Minutos de espera adicional antes de ejecutar |
| identificador | Nombre unico (usado para el timestamp en /var/spool/anacron/) |
| comando | Comando 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.txtEspecificaciones de tiempo en at
at acepta una variedad de formatos para especificar el momento de ejecucion:
| Formato | Ejemplo | Descripcion |
|---|---|---|
| Hora HH:MM | at 14:30 | A las 14:30 del dia actual (o siguiente si ya paso) |
| Hora 12h | at 2:30 PM | A las 2:30 PM |
noon | at noon | A las 12:00 del mediodia |
midnight | at midnight | A las 00:00 de la medianoche |
teatime | at teatime | A las 16:00 (4:00 PM) |
now + N min | at now + 30 minutes | Dentro de 30 minutos |
now + N hours | at now + 2 hours | Dentro de 2 horas |
now + N days | at now + 3 days | Dentro de 3 dias |
now + N weeks | at now + 1 week | Dentro de 1 semana |
tomorrow | at 10:00 tomorrow | Manana a las 10:00 |
| Fecha con mes | at 2:30 PM January 15 | 15 de enero a las 2:30 PM |
| Fecha ISO | at 14:00 2026-12-31 | 31 de diciembre de 2026 a las 14:00 |
| Hora + mes dia | at 10:00 AM Jul 4 | 4 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
| Comando | Descripcion |
|---|---|
at hora | Programar una tarea |
atq | Listar tareas pendientes (= at -l) |
atrm ID | Eliminar una tarea por su ID (= at -d ID) |
batch | Ejecutar 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 1Control de acceso a at
La logica es identica a la de cron:
| Situacion | Quien puede usar at |
|---|---|
/etc/at.allow existe | SOLO los usuarios listados |
/etc/at.allow NO existe, /etc/at.deny existe | Todos EXCEPTO los listados en at.deny |
| Ninguno existe | Depende 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:
- Archivo .timer - Define cuando se ejecuta
- 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.shOpciones de programacion del timer
| Opcion | Descripcion | Ejemplo |
|---|---|---|
OnCalendar | Tiempo basado en calendario | daily, weekly, *-*-* 02:30:00 |
OnBootSec | Tiempo despues del arranque | 15min |
OnUnitActiveSec | Tiempo despues de la ultima activacion | 1h |
OnActiveSec | Tiempo despues de la activacion del timer | 30s |
Persistent | Ejecutar 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
| Aspecto | cron | systemd timers |
|---|---|---|
| Logs | Salida por email | Integrado en journal (journalctl) |
| Dependencias | No soporta | Soporta dependencias de unidades |
| Recuperacion | No (necesita anacron) | Persistent=true |
| Control | crontab | systemctl (start/stop/enable/disable) |
| Precision | 1 minuto | Hasta 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.shEjecucion 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.shOpciones principales de systemd-run
| Opcion | Descripcion |
|---|---|
--on-active=TIEMPO | Ejecutar despues de un tiempo relativo (ej: 30s, 5m, 2h) |
--on-calendar=CALENDARIO | Ejecutar en un momento especifico o patron de calendario |
--on-boot=TIEMPO | Ejecutar N tiempo despues del arranque |
--unit=NOMBRE | Nombre de la unidad transitoria |
--description=DESC | Descripcion de la unidad |
--timer-property=PROP | Propiedades 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
- Formato crontab de usuario:
min hora dia mes dia_sem comando(5 campos + comando) - Formato /etc/crontab: Igual pero con campo usuario extra (6 campos + comando)
- cron.allow tiene prioridad sobre cron.deny. Si allow existe, deny se ignora
- Si solo allow existe: solo los listados; si solo deny existe: todos menos los listados
- Anacron: Para sistemas no siempre encendidos. Precision minima: dias. Solo root
- /etc/anacrontab:
periodo retardo identificador comando - at: Tareas unicas.
atqlista,atrmelimina,batchejecuta con carga baja - Tiempos especiales de at:
noon(12:00),midnight(00:00),teatime(16:00),now + N units - at.allow/at.deny: Misma logica que cron.allow/cron.deny
- systemd timers: Usan archivos
.timer+.service. OnCalendar para programacion systemd-run: Tareas unicas con systemd.--on-active=30spara ejecucion relativa,--on-calendarpara momento especificosystemctl list-timerspara 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/crontaby archivos en/etc/cron.d/tienen 6 campos + comando (incluyen el usuario). Olvidar el campo usuario al editar/etc/crontabcausa errores cron.allowtiene PRIORIDAD sobrecron.deny— Si/etc/cron.allowexiste, SOLO los usuarios listados pueden usar cron (cron.deny se ignora completamente). Si solo existecron.deny, todos pueden usar cron excepto los listados. La misma logica aplica aat.allow/at.deny/etc/cron.daily/contiene SCRIPTS, no lineas crontab — Los directorioscron.{hourly,daily,weekly,monthly}contienen scripts ejecutables normales, NO archivos con formato crontab. Se ejecutan conrun-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 deatincluyennoon(12:00),midnight(00:00) yteatime(16:00). El examen puede preguntar la hora equivalente ateatimebatchejecuta cuando la carga es BAJA —batchno programa para un momento especifico, sino que ejecuta cuando la carga del sistema baja de 0.8 (por defecto). No confundir conatque 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=truepermite recuperar ejecuciones perdidas (como anacron) systemd-run --on-activeusa tiempo RELATIVO —systemd-run --on-active=30sejecuta dentro de 30 segundos;--on-calendarusa tiempo absoluto. No confundir los formatos de tiempo de cada opcion