Día 06 - Crear un Cron Job con Cronie
Problema / Desafío
Instalar el paquete cronie en todos los app servers, iniciar el servicio crond y crear un cron job para el usuario root que ejecute echo hello > /tmp/cron_text cada 5 minutos.
Conceptos clave
- Cron: Es el programador de tareas de Linux. Permite ejecutar comandos o scripts de forma automática en horarios definidos.
- Cronie: Es la implementación moderna de cron usada en distribuciones basadas en RHEL (CentOS, Rocky Linux, Fedora). Reemplaza a
vixie-cron. - crond: Es el daemon (servicio) de cron. Se ejecuta en segundo plano y lee las tablas de cron para ejecutar tareas programadas.
- crontab: Es el archivo donde se definen las tareas programadas de un usuario. Cada usuario puede tener su propio crontab.
- Sintaxis de cron:
┌───────────── minuto (0-59)
│ ┌───────────── hora (0-23)
│ │ ┌───────────── día del mes (1-31)
│ │ │ ┌───────────── mes (1-12)
│ │ │ │ ┌───────────── día de la semana (0-7, 0 y 7 = domingo)
│ │ │ │ │
* * * * * comando
*/5: La barra (/) indica un intervalo.*/5en el campo de minutos significa "cada 5 minutos".crontab -e: Edita el crontab del usuario actual.crontab -l: Lista las entradas del crontab del usuario actual.crontab -u usuario -e: Edita el crontab de un usuario específico (requiere root).
Pasos
- Instalar el paquete
cronieen cada app server - Iniciar y habilitar el servicio
crond - Crear el cron job para el usuario
root - Verificar que el cron job quedó registrado
Comandos / Código
1. Instalar cronie
cronie incluye el daemon crond y la utilidad crontab.
2. Iniciar el servicio crond
Verificar que está corriendo:
Salida esperada:
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled)
Active: active (running)
3. Crear el cron job para root
Si no hay crontab existente, mostrará:
Agregar el cron job:
Nota: El guion (
-) al final decrontab -le indica que lea la entrada desde stdin. Si root ya tiene entradas en su crontab y se quieren conservar, se debe usar un enfoque diferente (ver sección de alternativas).
4. Verificar el cron job
Salida esperada:
Alternativa: Preservar crontab existente
Si el usuario root ya tiene cron jobs configurados, usar echo ... | crontab - los sobreescribiría. Para agregar sin perder las entradas existentes:
(crontab -l -u root 2>/dev/null; echo "*/5 * * * * echo hello > /tmp/cron_text") | crontab -u root -
Esto concatena las entradas existentes con la nueva línea antes de pasarlas a crontab -.
Alternativa: Usar crontab -e
Esto abre el editor para agregar manualmente la línea:
Ejecutar en todos los app servers
Si se tiene acceso SSH a múltiples app servers, se puede ejecutar todo en un solo flujo:
ssh app_server "sudo yum install -y cronie && sudo systemctl start crond && sudo systemctl enable crond && echo '*/5 * * * * echo hello > /tmp/cron_text' | sudo crontab -u root -"
Desglose del cron job
| Campo | Valor | Significado |
|---|---|---|
| Minuto | */5 |
Cada 5 minutos (0, 5, 10, 15, ..., 55) |
| Hora | * |
Todas las horas |
| Día del mes | * |
Todos los días |
| Mes | * |
Todos los meses |
| Día de la semana | * |
Todos los días de la semana |
| Comando | echo hello > /tmp/cron_text |
Escribe "hello" en /tmp/cron_text |
Dónde se almacenan los crontabs
| Ubicación | Descripción |
|---|---|
/var/spool/cron/ |
Crontabs de usuarios individuales (un archivo por usuario) |
/etc/crontab |
Crontab del sistema (requiere especificar usuario en cada línea) |
/etc/cron.d/ |
Archivos de cron adicionales del sistema |
/etc/cron.daily/ |
Scripts que se ejecutan una vez al día |
/etc/cron.hourly/ |
Scripts que se ejecutan una vez por hora |
/etc/cron.weekly/ |
Scripts que se ejecutan una vez por semana |
/etc/cron.monthly/ |
Scripts que se ejecutan una vez al mes |
Cuando usamos crontab -e o crontab -, el archivo se guarda en /var/spool/cron/<usuario>. Para root sería /var/spool/cron/root.
Redirección de file descriptors: 2>/dev/null y 2>&1
En el comando de la sección "Preservar crontab existente" se usa 2>/dev/null. Para entender por qué, hay que conocer los file descriptors (descriptores de archivo) que Linux asigna a todo proceso:
| FD | Nombre | Descripción |
|---|---|---|
0 |
stdin |
Entrada estándar (lo que el proceso lee) |
1 |
stdout |
Salida estándar (output normal) |
2 |
stderr |
Salida de errores |
Por defecto, tanto stdout como stderr se imprimen en la terminal, pero son flujos separados y se pueden redirigir de forma independiente.
2>/dev/null — Descartar errores
Redirige stderr (FD 2) a /dev/null, un archivo especial que descarta todo lo que recibe (un "agujero negro").
En el contexto de este día:
(crontab -l -u root 2>/dev/null; echo "*/5 * * * * echo hello > /tmp/cron_text") | crontab -u root -
Si root no tiene crontab, crontab -l imprime no crontab for root por stderr. Sin 2>/dev/null, ese mensaje de error se mezclaría con la salida del subshell y terminaría como una línea dentro del nuevo crontab. Al descartarlo con 2>/dev/null, solo pasa la nueva línea del echo.
2>&1 — Fusionar stderr con stdout
Redirige stderr (FD 2) al mismo destino que stdout (FD 1). El & indica que 1 es un file descriptor, no un archivo llamado "1".
# Sin redirección: stdout y stderr van a la terminal por separado
comando
# Con 2>&1: stderr se fusiona con stdout
comando 2>&1
Uso común — guardar toda la salida (normal + errores) en un log:
Sin 2>&1, solo stdout iría al archivo y los errores seguirían apareciendo en la terminal.
Resumen de combinaciones
comando > archivo # stdout → archivo, stderr → terminal
comando 2> archivo # stdout → terminal, stderr → archivo
comando > archivo 2>&1 # stdout → archivo, stderr → mismo archivo
comando 2>/dev/null # stdout → terminal, stderr → descartado
comando > /dev/null 2>&1 # todo descartado (silencio total)
Por qué > y 2> son operadores diferentes
El número antes de > indica qué file descriptor se redirige:
| Operador | Equivalente explícito | Qué redirige |
|---|---|---|
> |
1> |
stdout (se asume FD 1 por defecto) |
2> |
— | stderr (FD 2 explícito) |
&> |
> archivo 2>&1 |
Ambos (shortcut en bash) |
Troubleshooting
| Problema | Solución |
|---|---|
crond no inicia: Unit crond.service not found |
El paquete cronie no está instalado. Ejecutar yum install -y cronie |
crontab: command not found |
Instalar cronie que incluye el binario crontab |
| El cron job no se ejecuta | Verificar que crond está activo con systemctl status crond |
El archivo /tmp/cron_text no aparece |
Esperar al menos 5 minutos. Verificar el cron con crontab -l -u root |
echo ... | crontab - sobreescribió los cron jobs existentes |
Restaurar desde backup si existe, o reconstruir. Usar la alternativa con (crontab -l; echo ...) | crontab - |
| Cron ejecuta el comando pero el archivo no tiene el contenido esperado | Verificar que la redirección > es correcta (sobreescribe) vs >> (agrega) |