O cron executa comandos em horários definidos. É o que mantém backups, limpezas e reinícios rodando sem você lembrar.

## Sintaxe

```
┌ minuto (0-59)
│ ┌ hora (0-23)
│ │ ┌ dia do mês (1-31)
│ │ │ ┌ mês (1-12)
│ │ │ │ ┌ dia da semana (0-7, 0 e 7 = domingo)
│ │ │ │ │
* * * * *  comando
```

| Expressão | Quando |
|---|---|
| `0 3 * * *` | todo dia às 3h |
| `*/15 * * * *` | a cada 15 minutos |
| `0 */6 * * *` | a cada 6 horas |
| `30 4 * * 0` | domingo às 4h30 |
| `0 0 1 * *` | dia 1 de cada mês à meia-noite |
| `@reboot` | quando a VPS liga |

Confira o fuso horário: `timedatectl` (ajuste com `sudo timedatectl set-timezone America/Sao_Paulo`). Sites como crontab.guru traduzem expressões.

## Editar

```
crontab -e            # do usuário atual
sudo crontab -e       # do root (tarefas de sistema)
crontab -l            # listar
```

Exemplos:

```
# backup diário para o Object Storage
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

# limpeza de logs e cache toda semana
0 4 * * 0 journalctl --vacuum-size=200M && apt clean

# reiniciar um serviço de jogo às 6h
0 6 * * * /home/vhserver/vhserver restart

# monitor do LinuxGSM (sobe o servidor se cair)
*/5 * * * * /home/vhserver/vhserver monitor > /dev/null 2>&1

# atualizar containers de madrugada
0 5 * * * cd /opt/n8n && docker compose pull && docker compose up -d
```

## Erros mais comuns

- **Caminho relativo / variável de ambiente:** o cron roda com um `PATH` mínimo. Use caminhos completos (`/usr/bin/docker`, `/usr/local/bin/rclone`) e defina `PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin` na primeira linha do crontab.
- **`%` na linha:** no cron `%` vira quebra de linha; escape como `\%` (ex.: `date +\%F`).
- **Script sem permissão de execução:** `chmod +x script.sh`.
- **Sem log, sem diagnóstico:** sempre termine com `>> /var/log/algo.log 2>&1`.
- **Rodou sobreposto:** tarefas longas (backup) podem começar antes da anterior terminar. Use `flock`: `0 3 * * * flock -n /tmp/backup.lock /usr/local/bin/backup.sh`.

## Ver o que aconteceu

```
grep CRON /var/log/syslog | tail        # Ubuntu/Debian
journalctl -u cron --since today
```

## Alternativa moderna: systemd timers

Para tarefas que dependem de outros serviços ou precisam de log estruturado (`journalctl -u nome.timer`), timers do systemd substituem o cron. Para a maioria dos casos, o cron acima resolve.
