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
Dica: use o site 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
Dica: dentro dos scripts executados pelo cron, sempre use caminhos absolutos para comandos (ex: /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