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
PATHmínimo. Use caminhos completos (/usr/bin/docker,/usr/local/bin/rclone) e definaPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binna 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.