Como agendar tarefas com cron na VPS (backups, limpeza e reinícios)

Henrique Siqueira

Henrique Siqueira

Última atualização em Sep 29, 2026

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.