crontab -e e crontab -l
O cron é o agendador de tarefas clássico do Linux. Cada usuário possui sua própria crontab:
# Editar a crontab do usuário atual
crontab -e
# Listar as tarefas agendadas
crontab -l
# Ver a crontab de outro usuário (requer root)
sudo crontab -u www-data -l
Sintaxe dos 5 campos
Cada linha da crontab segue o formato:
# minuto hora dia_mês mês dia_semana comando
# 0-59 0-23 1-31 1-12 0-7
# (0 e 7 = domingo)
Exemplos práticos:
# Todo dia às 3:30 da manhã
30 3 * * * /opt/scripts/backup.sh
# A cada 15 minutos
*/15 * * * * /usr/bin/check-disk.sh
# Seg a sex às 8h
0 8 * * 1-5 /opt/scripts/relatorio.sh
# Primeiro dia de cada mês às 00:00
0 0 1 * * /opt/scripts/limpeza-mensal.sh
# Toda terça e quinta às 14:30
30 14 * * 2,4 /opt/scripts/sync.sh
crontab.guru para validar suas expressões cron visualmente antes de colocar em produção.Atalhos especiais
O cron aceita strings especiais para intervalos comuns:
@reboot /opt/scripts/inicializar.sh # Executar ao iniciar o sistema
@hourly /opt/scripts/check.sh # Equivale a: 0 * * * *
@daily /opt/scripts/backup.sh # Equivale a: 0 0 * * *
@weekly /opt/scripts/relatorio.sh # Equivale a: 0 0 * * 0
@monthly /opt/scripts/limpeza.sh # Equivale a: 0 0 1 * *
Diretório /etc/cron.d/
Além das crontabs individuais, o sistema usa diretórios para tarefas globais:
# Listar jobs do sistema
ls /etc/cron.d/
e2scrub_all certbot sysstat
Arquivos em /etc/cron.d/ seguem a mesma sintaxe, mas incluem o campo de usuário antes do comando:
# /etc/cron.d/certbot
0 */12 * * * root certbot -q renew
Existem também os diretórios /etc/cron.hourly/, /etc/cron.daily/, /etc/cron.weekly/ e /etc/cron.monthly/. Basta colocar um script executável dentro deles.
Troubleshooting
Verificando os logs
Quando um cron job não funciona, o primeiro passo é olhar os logs:
# systemd/journalctl
journalctl -u cron -n 30
# Ou em sistemas mais antigos
grep CRON /var/log/syslog | tail -20
Mar 21 03:30:01 srv01 CRON[8421]: (root) CMD (/opt/scripts/backup.sh)
Mar 21 03:30:01 srv01 CRON[8420]: (CRON) info (No MTA installed, discarding output)
Problema clássico: PATH
O cron executa com um PATH mínimo. Comandos que funcionam no terminal podem falhar no cron porque não estão no PATH.
# Definir PATH no início da crontab
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
*/5 * * * * /opt/scripts/monitor.sh
/usr/bin/curl em vez de apenas curl).Permissões
O script precisa ter permissão de execução. Além disso, os arquivos /etc/cron.allow e /etc/cron.deny controlam quem pode usar o crontab:
# Dar permissão de execução
chmod +x /opt/scripts/backup.sh
# Se existir cron.allow, apenas usuários listados podem usar cron
cat /etc/cron.allow
Redirecionando saída
Por padrão, o cron tenta enviar a saída por e-mail. Se não houver MTA instalado, a saída é descartada silenciosamente. Redirecione para um log:
# Salvar stdout e stderr em arquivo
30 3 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1
# Descartar toda saída (não recomendado para debug)
30 3 * * * /opt/scripts/backup.sh > /dev/null 2>&1