Quando precisamos agendar tarefas automatizadas em sistemas Linux, existem duas abordagens distintas para configurar o cron, cada uma com seu propósito específico e implicações de segurança.
Abordagem por usuário: comando crontab
Através do comando crontab -e, criamos agendamentos vinculados a uma conta específica. O sistema armazena essas configurações em /var/spool/cron/ ou /var/spool/cron/crontabs/, dependendo da distribuição, gerando arquivos nomeados conforme o usuário.
Exemplo de estrutura gerada:
[usuario@servidor ~]$ crontab -e
# Adicionada linha: 0 2 * * * /home/usuario/scripts/backup_db.sh
[usuario@servidor ~]$ sudo ls -la /var/spool/cron/
total 12
drwxr-xr-x. 2 root root 22 Jun 15 09:00 .
drwxr-xr-x. 5 root root 41 Jun 10 14:32 ..
-rw-------. 1 root root 156 Jun 15 09:15 root
-rw-------. 1 usuario usuario 89 Jun 15 08:45 usuario
Conteúdo típico de arquivo de spool:
[usuario@servidor ~]$ sudo cat /var/spool/cron/usuario
# Backup diário do banco de dados
0 2 * * * /home/usuario/scripts/backup_db.sh >/dev/null 2>&1
# Limpeza de logs semanal
0 3 * * 0 /home/usuario/scripts/limpa_logs.sh
Abordagem administrativa: arquivo /etc/crontab
O arquivo /etc/crontab serve para configurações de nível sistêmico, exigindo privilégios de superusuário. Sua estrutura obriga a especificação explícita da conta que executará cada comando.
Formato característico:
[admin@servidor ~]$ cat /etc/crontab
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Variáveis de ambiente
MAILTO=admin@empresa.com
HOME=/
# Sincronização de horário
*/30 * * * * root /usr/sbin/chronyd -q 'server pool.ntp.br iburst'
# Tarefas de manutenção do sistema
05 2 * * * root /usr/sbin/aide --check
15 3 * * 1 root /usr/sbin/fstrim -av
30 4 1 * * root /usr/local/bin/relatorio_mensal.sh
# Diretórios de agendamento em massa
*/5 * * * * root run-parts /etc/cron.d/5minutos
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
Diretório /etc/cron.d como alternativa
Além de editar /etc/crontab diretamente, pacotes de software frequentemente depositam arquivos em /etc/cron.d/, mantendo configurações modulares e evitando conflitos durante atualizações.
Exemplo de arquivo em /etc/cron.d/:
[admin@servidor ~]$ cat /etc/cron.d/sincroniza_dados
# Sincronização de arquivos entre servidores
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
*/10 * * * * syncuser /usr/bin/rsync -az --delete /dados/origem/ servidor-remoto:/dados/mirror/
Comparação de características
| Aspecto | crontab -e | /etc/crontab ou /etc/cron.d/ |
|---|---|---|
| Escopo | Usuário individual | Todo o sistema |
| Permissões necessárias | Própria conta | root |
| Local de armazenamento | /var/spool/cron/ | /etc/crontab ou /etc/cron.d/ |
| Sintaxe da linha temporal | 5 campos (sem usuário) | 6 campos (inclui usuário) |
| Validação de sintaxe | Automática ao salvar | Manual (crond recarrega periodicamente) |
| Visibilidade | Restrita ao usuário/root | Global para administradores |
Práticas recomandadas
Para rotinas pessoais de desenvolvedores ou operadores, prefira crontab -e, que oferece verificação sintática automática e isolação de permissões. Para serviços críticos de infraestrutura que devem persistir independentemente de contas de usuário, utilize /etc/cron.d/ com arquivos descritivos e versionados, ou edite /etc/crontab quando necessário centralizar configurações sistêmicas.
Após modificações manuais em arquivos de sistema, force o recarregamento do serviço:
sudo systemctl restart crond
# ou em sistemas mais antigos:
sudo service cron restart