# Referência Rápida de Cron

*Agendamento de jobs, sintaxe do crontab, strings especiais, logging*

> Source: crontab(5) Manual Page · MIT

## Sintaxe

### Formato do Crontab

```
# ┌───── minute (0-59)
# │ ┌───── hour (0-23)
# │ │ ┌───── day of month (1-31)
# │ │ │ ┌───── month (1-12)
# │ │ │ │ ┌───── day of week (0-7, 0&7=Sun)
# * * * * * command
```

### Valores de Campo

| Command | Description |
|---------|-------------|
| `*` | Qualquer valor (curinga) |
| `,` | Lista de valores: `1,3,5` |
| `-` | Intervalo: `1-5` |
| `/` | Passo: `*/10` (a cada 10) |
| `0-59` | Intervalo de minutos |
| `0-23` | Intervalo de horas |
| `1-31` | Intervalo de dia do mês |
| `1-12` | Intervalo de mês (ou JAN-DEC) |
| `0-7` | Dia da semana (0&7=Dom, ou SUN-SAT) |

## Strings Especiais

### Agendamentos Abreviados

| Command | Description |
|---------|-------------|
| `@reboot` | Executar uma vez ao iniciar |
| `@yearly` | `0 0 1 1 *` — uma vez por ano (1º de jan) |
| `@monthly` | `0 0 1 * *` — uma vez por mês (dia 1) |
| `@weekly` | `0 0 * * 0` — uma vez por semana (domingo) |
| `@daily` | `0 0 * * *` — uma vez por dia (meia-noite) |
| `@hourly` | `0 * * * *` — uma vez por hora |

## Exemplos

### Agendamentos Comuns

```
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
```

### Explicação dos Agendamentos

| Command | Description |
|---------|-------------|
| `30 2 * * *` | Todo dia às 2:30 |
| `0 9 * * 1-5` | Dias úteis às 9:00 |
| `*/15 * * * *` | A cada 15 minutos |
| `0 0 1 * *` | Primeiro dia do mês, meia-noite |
| `0 8,17 * * *` | Todo dia às 8h e às 17h |

## Ambiente

### Definindo Variáveis

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

### Notas de Ambiente

| Command | Description |
|---------|-------------|
| `SHELL` | Shell usado para executar comandos (padrão `/bin/sh`) |
| `PATH` | Caminho de busca (o padrão do cron é mínimo) |
| `MAILTO` | Enviar saída para este e-mail (vazio = sem e-mail) |
| `HOME` | Diretório home para o job cron |

## Logging

### Saída & Logging

```
# redirect stdout + stderr to a log file
*/5 * * * * /opt/job.sh >> /var/log/job.log 2>&1
# discard all output
0 3 * * * /opt/job.sh > /dev/null 2>&1
# log only errors
0 3 * * * /opt/job.sh > /dev/null 2>> /var/log/job-err.log
```

### Visualizar Logs do Cron

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

## Agendamentos Comuns

### Padrões do Dia a Dia

| Command | Description |
|---------|-------------|
| `0 * * * *` | A cada hora (no início) |
| `*/5 * * * *` | A cada 5 minutos |
| `*/30 * * * *` | A cada 30 minutos |
| `0 0 * * *` | Todo dia à meia-noite |
| `0 6 * * 1` | Toda segunda-feira às 6h |
| `0 0 1,15 * *` | Dia 1 e 15 do mês |
| `0 0 * * 5` | Toda sexta-feira à meia-noite |
| `0 0 1 1 *` | Todo dia 1 de janeiro |

## Comandos crontab

### Gerenciar Crontabs

```
crontab -e               # edit your crontab
crontab -l               # list your crontab
crontab -r               # remove your crontab
crontab -u alice -l      # list another user's (root)
crontab /path/to/file    # install crontab from file
```

### Locais de Crontab do Sistema

| Command | Description |
|---------|-------------|
| `/etc/crontab` | Crontab do sistema (tem campo de usuário) |
| `/etc/cron.d/` | Arquivos cron drop-in |
| `/etc/cron.daily/` | Scripts executados diariamente |
| `/etc/cron.hourly/` | Scripts executados por hora |
| `/etc/cron.weekly/` | Scripts executados semanalmente |
| `/etc/cron.monthly/` | Scripts executados mensalmente |
| `/var/spool/cron/` | Armazenamento de crontab por usuário |

## Dicas

### Boas Práticas

| Command | Description |
|---------|-------------|
| `Use caminhos absolutos` | O PATH do cron é mínimo; sempre use caminhos completos |
| `Redirecione a saída` | Evite floods de e-mail com `> /dev/null 2>&1` |
| `Arquivos de lock` | Use `flock` para evitar execuções sobrepostas |
| `Teste antes` | Execute o comando manualmente antes de agendar |
| `Use MAILTO` | Defina `MAILTO=""` para suprimir todo e-mail |
| `Verifique o fuso horário` | Cron usa horário do sistema; verifique com `date` |

### Evitando Sobreposição com flock

```
# only run if not already running
* * * * * /usr/bin/flock -n /tmp/job.lock /opt/job.sh
```
