# Referencia Rápida de Cron

*Programación de tareas, sintaxis crontab, cadenas especiales, logging*

> Source: crontab(5) Manual Page · MIT

## Sintaxis

### Formato Crontab

```
# ┌───── minuto (0-59)
# │ ┌───── hora (0-23)
# │ │ ┌───── día del mes (1-31)
# │ │ │ ┌───── mes (1-12)
# │ │ │ │ ┌───── día de la semana (0-7, 0&7=Dom)
# * * * * * comando
```

### Valores de Campo

| Command | Description |
|---------|-------------|
| `*` | Cualquier valor (comodín) |
| `,` | Lista de valores: `1,3,5` |
| `-` | Rango: `1-5` |
| `/` | Paso: `*/10` (cada 10) |
| `0-59` | Rango de minutos |
| `0-23` | Rango de horas |
| `1-31` | Rango de día del mes |
| `1-12` | Rango de mes (o ENE-DIC) |
| `0-7` | Día de la semana (0&7=Dom, o DOM-SAB) |

## Cadenas Especiales

### Horarios Abreviados

| Command | Description |
|---------|-------------|
| `@reboot` | Ejecutar una vez al inicio |
| `@yearly` | `0 0 1 1 *` — una vez al año (1 de enero) |
| `@monthly` | `0 0 1 * *` — una vez al mes (día 1) |
| `@weekly` | `0 0 * * 0` — una vez a la semana (domingo) |
| `@daily` | `0 0 * * *` — una vez al día (medianoche) |
| `@hourly` | `0 * * * *` — una vez por hora |

## Ejemplos

### Horarios Comunes

```
30 2 * * *   /usr/local/bin/backup.sh
0 9 * * 1-5  /opt/report.sh
*/15 * * * *  /usr/bin/health-check.sh
0 0 1 * *    /opt/monthly-cleanup.sh
0 8,17 * * * /opt/notify.sh
```

### Desglose de Horarios

| Command | Description |
|---------|-------------|
| `30 2 * * *` | Diariamente a las 2:30 AM |
| `0 9 * * 1-5` | Días de semana a las 9:00 AM |
| `*/15 * * * *` | Cada 15 minutos |
| `0 0 1 * *` | Primer día del mes, medianoche |
| `0 8,17 * * *` | Diariamente a las 8 AM y 5 PM |

## Entorno

### Establecer Variables

```
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=admin@example.com
HOME=/home/deploy
* * * * * /opt/myjob.sh
```

### Notas de Entorno

| Command | Description |
|---------|-------------|
| `SHELL` | Shell para ejecutar comandos (por defecto `/bin/sh`) |
| `PATH` | Ruta de búsqueda (cron usa una mínima por defecto) |
| `MAILTO` | Enviar salida a este correo (vacío = sin correo) |
| `HOME` | Directorio home para el trabajo cron |

## Logging

### Salida y Logging

```
# redirigir stdout + stderr a un archivo de log
*/5 * * * * /opt/job.sh >> /var/log/job.log 2>&1
# descartar toda la salida
0 3 * * * /opt/job.sh > /dev/null 2>&1
# registrar solo errores
0 3 * * * /opt/job.sh > /dev/null 2>> /var/log/job-err.log
```

### Ver Logs de Cron

```
# Debian / Ubuntu (syslog)
grep CRON /var/log/syslog
# RHEL / CentOS
cat /var/log/cron
# journalctl (systemd)
journalctl -u cron --since "1 hour ago"
```

## Horarios Comunes

### Patrones Cotidianos

| Command | Description |
|---------|-------------|
| `0 * * * *` | Cada hora en punto |
| `*/5 * * * *` | Cada 5 minutos |
| `*/30 * * * *` | Cada 30 minutos |
| `0 0 * * *` | Diariamente a medianoche |
| `0 6 * * 1` | Cada lunes a las 6 AM |
| `0 0 1,15 * *` | Días 1 y 15 del mes |
| `0 0 * * 5` | Cada viernes a medianoche |
| `0 0 1 1 *` | Cada 1 de enero |

## Comandos crontab

### Gestionar Crontabs

```
crontab -e               # editar tu crontab
crontab -l               # listar tu crontab
crontab -r               # eliminar tu crontab
crontab -u alice -l      # listar crontab de otro usuario (root)
crontab /path/to/file    # instalar crontab desde archivo
```

### Ubicaciones de Crontab del Sistema

| Command | Description |
|---------|-------------|
| `/etc/crontab` | Crontab del sistema (incluye campo de usuario) |
| `/etc/cron.d/` | Archivos cron de complemento |
| `/etc/cron.daily/` | Scripts ejecutados diariamente |
| `/etc/cron.hourly/` | Scripts ejecutados cada hora |
| `/etc/cron.weekly/` | Scripts ejecutados semanalmente |
| `/etc/cron.monthly/` | Scripts ejecutados mensualmente |
| `/var/spool/cron/` | Almacenamiento de crontab por usuario |

## Consejos

### Buenas Prácticas

| Command | Description |
|---------|-------------|
| `Usar rutas absolutas` | El PATH de cron es mínimo; usar siempre rutas completas |
| `Redirigir salida` | Evitar desbordamiento de correos con `> /dev/null 2>&1` |
| `Archivos de lock` | Usar `flock` para evitar ejecuciones superpuestas |
| `Probar primero` | Ejecutar el comando manualmente antes de programarlo |
| `Usar MAILTO` | Configurar `MAILTO=""` para suprimir todo el correo |
| `Verificar zona horaria` | Cron usa la hora del sistema; verificar con `date` |

### Evitar Solapamiento con flock

```
# ejecutar solo si no está ya en ejecución
* * * * * /usr/bin/flock -n /tmp/job.lock /opt/job.sh
```
