Por que automatizar tarefas com cron?
Backups noturnos, limpeza de logs, sincronização de dados, envio de relatórios, renovação de certificados SSL — todas essas tarefas recorrentes podem ser automatizadas com o cron, o agendador de tarefas padrão do Linux.
Entendendo a sintaxe do crontab
Cada linha do crontab segue o formato:
# ┌───── minuto (0–59)
# │ ┌───── hora (0–23)
# │ │ ┌───── dia do mês (1–31)
# │ │ │ ┌───── mês (1–12)
# │ │ │ │ ┌───── dia da semana (0–7, domingo = 0 ou 7)
# │ │ │ │ │
# * * * * * comando a executar
Editando o crontab
crontab -e # editar crontab do usuário atual
crontab -l # listar tarefas agendadas
crontab -r # remover todas as tarefas (cuidado!)
# Crontab do sistema (requer sudo)
sudo nano /etc/crontab
Exemplos práticos
# Executar todo dia às 2h da manhã
0 2 * * * /usr/bin/backup.sh
# A cada 5 minutos
*/5 * * * * /usr/bin/check-status.sh
# Às 23:59 de toda sexta-feira
59 23 * * 5 /usr/bin/relatorio-semanal.sh
# Primeiro dia de cada mês às 6h
0 6 1 * * /usr/bin/backup-mensal.sh
# A cada hora, de segunda a sexta
0 * * * 1-5 /usr/bin/sync-dados.sh
# A cada 30 minutos
*/30 * * * * /usr/bin/health-check.sh
# Múltiplos horários (8h e 18h)
0 8,18 * * * /usr/bin/notificacao.sh
# Renovação do certificado Let's Encrypt
0 3 * * * certbot renew --quiet
Atalhos especiais do cron
@reboot /usr/bin/iniciar-servico.sh # ao iniciar o sistema
@hourly /usr/bin/tarefa.sh # a cada hora
@daily /usr/bin/backup.sh # todo dia (meia-noite)
@weekly /usr/bin/limpeza.sh # todo domingo
@monthly /usr/bin/relatorio.sh # todo dia 1
Boas práticas para crontabs em produção
# Use caminhos absolutos sempre
0 2 * * * /usr/bin/python3 /home/deploy/scripts/backup.py
# Redirecione saída para log
0 2 * * * /usr/bin/backup.sh >> /var/log/backup.log 2>&1
# Silenciar saída (não envia e-mail)
0 2 * * * /usr/bin/backup.sh > /dev/null 2>&1
# Variável PATH explícita no crontab
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
systemd timers: alternativa moderna ao cron
# Criar um timer systemd (mais confiável que cron para serviços)
sudo nano /etc/systemd/system/meu-backup.service
# [Unit]
# Description=Backup diário
# [Service]
# Type=oneshot
# ExecStart=/usr/bin/backup.sh
sudo nano /etc/systemd/system/meu-backup.timer
# [Unit]
# Description=Timer para backup diário
# [Timer]
# OnCalendar=*-*-* 02:00:00
# Persistent=true
# [Install]
# WantedBy=timers.target
sudo systemctl enable --now meu-backup.timer
sudo systemctl list-timers # listar todos os timers ativos
Dica: Use crontab.guru para validar e entender expressões cron antes de colocar em produção.