# Explicação do comando crontab

O daemon cron (crond) é um serviço em segundo plano em sistemas operacionais Unix que executa comandos agendados. Ele lê a configuração de arquivos crontab (tabelas cron), que definem quando e com que frequência cada comando deve ser executado.

## Sintaxe

O comando crontab gerencia os arquivos crontab de cada usuário:

```
crontab [-u user] [-l | -r | -e | -i] [file]
```

## Opções

- **`-e`**: Edita o crontab do usuário atual no editor padrão ($VISUAL ou $EDITOR). O novo crontab é instalado após o editor ser fechado.
- **`-l`**: Exibe o crontab do usuário atual na saída padrão.
- **`-r`**: Remove completamente o crontab do usuário atual.
- **`-i`**: Solicita confirmação antes de remover (usado com -r).
- **`-u user`**: Opera no crontab do usuário especificado em vez do seu. Requer privilégios root.
- **`file`**: Instala o crontab a partir do arquivo fornecido. Use - para entrada padrão.

## Formato do arquivo crontab

Cada linha em um arquivo crontab é uma atribuição de variável de ambiente, um comentário (começando com #) ou um cron job com este formato:

```
┌───────────── minuto (0–59)
│ ┌───────────── hora (0–23)
│ │ ┌───────────── dia do mês (1–31)
│ │ │ ┌───────────── mês (1–12 ou JAN–DEC)
│ │ │ │ ┌───────────── dia da semana (0–6 ou SUN–SAT)
│ │ │ │ │
* * * * *  comando a executar
```

## Operadores de campo

- *** (asterisk)**: Corresponde a todos os valores possíveis do campo.
- **, (comma)**: Especifica uma lista de valores. Exemplo: 1,15 no campo dia do mês significa o dia 1 e o dia 15.
- **- (hyphen)**: Define um intervalo inclusivo. Exemplo: 9-17 no campo hora significa todas as horas de 9 a 17.
- **/ (slash)**: Define um passo. Exemplo: */10 no campo minuto significa a cada 10 minutos. Pode ser combinado com um intervalo: 1-30/5.

## Strings especiais

Em vez dos cinco campos de tempo, você pode usar uma destas strings abreviadas:

| String | Equivalent |
|--------|-----------|
| `@yearly` / `@annually` | `0 0 1 1 *` |
| `@monthly` | `0 0 1 * *` |
| `@weekly` | `0 0 * * 0` |
| `@daily` / `@midnight` | `0 0 * * *` |
| `@hourly` | `0 * * * *` |
| `@reboot` | `Run once at startup` |

## Variáveis de ambiente

Você pode definir variáveis de ambiente no início de um arquivo crontab. As mais comuns são:

- **SHELL**: O shell usado para executar comandos (padrão: /bin/sh).
- **PATH**: O caminho de busca para comandos. O PATH padrão do cron é mínimo (geralmente /usr/bin:/bin), então sempre use caminhos absolutos ou defina PATH explicitamente.
- **MAILTO**: Para onde enviar a saída dos comandos. Defina como "" para suprimir e-mails. Por padrão, a saída é enviada por e-mail ao proprietário do crontab.
- **CRON_TZ**: Define o fuso horário para o crontab (não suportado em todos os sistemas). Sem ele, o cron usa o fuso horário do sistema.

```
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=admin@example.com

*/5 * * * * /home/user/scripts/backup.sh
```

## Crontab do sistema vs. crontab do usuário

Os crontabs de usuário (editados com crontab -e) têm cinco campos de tempo mais o comando. O crontab do sistema (/etc/crontab) e os arquivos em /etc/cron.d/ têm um campo extra entre os campos de tempo e o comando: o nome do usuário que executará o comando.

Exemplo de crontab do sistema:

```
# /etc/crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m  h  dom mon dow user    command
*/15 *  *   *   *   root    /usr/local/bin/system-check.sh
0    2  *   *   *   backup  /usr/local/bin/nightly-backup.sh
```

## Armadilhas comuns

### % (percent sign)

O sinal de porcentagem (%) tem significado especial no crontab: é convertido em uma nova linha, e tudo após o primeiro % é enviado como entrada padrão para o comando. Para usar um % literal, faça o escape com \%.

```
# Wrong — the % will be interpreted
0 0 * * * echo "Date: $(date +%Y-%m-%d)"

# Correct — escape the %
0 0 * * * echo "Date: $(date +\%Y-\%m-\%d)"
```

### PATH

O cron executa com um PATH mínimo. Scripts que dependem de comandos em /usr/local/bin ou outros diretórios devem usar caminhos absolutos ou definir PATH no início do crontab.

### Day-of-month + day-of-week

Quando tanto o dia do mês quanto o dia da semana são restritos (não *), o cron executa o comando quando qualquer um dos campos corresponde (lógica OR), não quando ambos correspondem. Por exemplo, 0 0 1 * 5 executa à meia-noite no dia 1 de cada mês E toda sexta-feira.

### Timezone

O cron usa o fuso horário do sistema por padrão. Se o servidor está em UTC mas você quer executar jobs em um fuso horário local, use CRON_TZ (quando suportado) ou converta os horários manualmente.

### Output and logging

Por padrão, o cron envia toda a saída (stdout e stderr) ao proprietário do crontab. Para silenciar um job, redirecione a saída: command > /dev/null 2>&1. Para registrar a saída, redirecione para um arquivo: command >> /var/log/myjob.log 2>&1.

```
# Discard all output
*/5 * * * * /path/to/script.sh > /dev/null 2>&1

# Log output to a file
*/5 * * * * /path/to/script.sh >> /var/log/myscript.log 2>&1
```

## Exemplos práticos

- [`*/5 * * * *`](https://crontab.run/pt/every-5-minutes) — run every 5 minutes
- [`0 0 * * *`](https://crontab.run/pt/daily) — run once a day at midnight
- [`0 9 * * 1-5`](https://crontab.run/pt/every-weekday-at-9am) — run at 9 AM on weekdays
- [`0 0 1 * *`](https://crontab.run/pt/every-month) — run at midnight on the 1st of every month
- [`0 0 * * 0`](https://crontab.run/pt/every-sunday) — run at midnight every Sunday

Canonical: https://crontab.run/pt/command

---

Maintained by Jsmon — https://jsmon.sh
