O Guia de Referência do Cron no Linux
Você fez o deploy da sua aplicação Node em um servidor Linux e precisa que um script seja executado todas as noites às 3h da manhã. Você já ouviu falar do cron, mas a sintaxe parece enigmática e os tutoriais que você encontrou estão desatualizados ou cheios de imprecisões. Este guia de referência do cron no Linux oferece a referência correta e consciente das distribuições que você precisa para um agendamento confiável de tarefas cron.
Principais Conclusões
- O Cron usa um formato de cinco campos (minuto, hora, dia do mês, mês, dia da semana) seguido pelo comando a ser executado.
- Quando tanto o dia do mês quanto o dia da semana são especificados, o cron os trata como OU, não E—uma fonte comum de comportamento inesperado.
- O Cron é executado com um ambiente limitado e dependente da distribuição, portanto sempre use caminhos absolutos e defina explicitamente o PATH para portabilidade.
- Diferentes distribuições Linux usam diferentes implementações de cron com suporte variado de recursos.
Sintaxe do Crontab: O Formato de Cinco Campos
Cada tarefa cron segue esta estrutura:
┌───────────── minuto (0-59)
│ ┌─────────── hora (0-23)
│ │ ┌───────── dia do mês (1-31)
│ │ │ ┌─────── mês (1-12)
│ │ │ │ ┌───── dia da semana (0-6, Domingo=0)
│ │ │ │ │
* * * * * comando
Caracteres especiais:
*— qualquer valor,— separador de lista (1,3,5)-— intervalo (1-5)/— valores de passo (*/15 significa a cada 15)
Importante: Caracteres como L, W, # e ? são sintaxe do agendador Quartz, não do cron padrão. Não os use em crontabs do Linux. Em caso de dúvida, consulte a documentação do seu próprio sistema via man 5 crontab.
Padrões Comuns de Agendamento
*/5 * * * * # A cada 5 minutos
0 * * * * # No início de cada hora
0 3 * * * # Diariamente às 3h da manhã
0 0 * * 0 # Semanalmente aos domingos à meia-noite
0 0 1 * * # Primeiro dia de cada mês
Strings Especiais
A maioria das implementações de cron suporta estes atalhos (o suporte pode variar em sistemas mínimos como BusyBox):
| String | Equivalente |
|---|---|
@reboot | Executa uma vez na inicialização |
@hourly | 0 * * * * |
@daily | 0 0 * * * |
@weekly | 0 0 * * 0 |
@monthly | 0 0 1 * * |
@yearly | 0 0 1 1 * |
Note que @reboot não garante que a rede ou outros serviços estejam disponíveis; para tarefas de inicialização com dependências, os timers do systemd geralmente são uma opção melhor.
A Armadilha do Dia do Mês vs Dia da Semana
Quando você especifica tanto o dia do mês QUANTO o dia da semana, o cron os trata como OU, não E:
0 0 15 * 1 # Executa no dia 15 OU em qualquer segunda-feira
Isso pega muitas pessoas desprevenidas. Se você precisa “do dia 15, mas apenas se for segunda-feira”, trate essa lógica dentro do seu script.
Gerenciamento de Ambiente
O Cron é executado com um ambiente limitado e não interativo. É aqui que a maioria das tarefas falha silenciosamente.
O comportamento do PATH varia por distribuição e versão:
- Alguns sistemas definem um PATH padrão mínimo
- Outros (notavelmente versões mais recentes do Ubuntu) podem herdar o PATH do ambiente do serviço
Não confie nos padrões. Para comportamento portável e previsível, defina explicitamente o que você precisa.
Práticas seguras:
# Defina variáveis no topo do seu crontab
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=""
# Sempre use caminhos absolutos
0 3 * * * /usr/bin/node /home/deploy/app/cleanup.js
Nota: MAILTO só funciona se um MTA local estiver instalado e configurado. Muitos servidores modernos não têm um. Redirecione a saída explicitamente em vez de depender de e-mail.
Discover how at OpenReplay.com.
Saída e Registro de Logs
# Registrar tudo
0 3 * * * /path/to/script.sh >> /var/log/myjob.log 2>&1
# Descartar toda a saída
0 3 * * * /path/to/script.sh >/dev/null 2>&1
# Registrar apenas erros
0 3 * * * /path/to/script.sh >/dev/null 2>> /var/log/myjob-errors.log
Comandos Essenciais do Crontab
crontab -e # Editar seu crontab
crontab -l # Listar tarefas atuais
crontab -r # Remover todas as tarefas (cuidado!)
Para tarefas de todo o sistema, use arquivos em /etc/cron.d/. Note que /etc/cron.daily/, /etc/cron.hourly/, etc. são executados via run-parts, não escaneados automaticamente pelo cron. Veja man 8 run-parts para regras de nomenclatura e execução.
As Implementações de Cron Variam
Diferentes sistemas executam diferentes daemons de cron:
- Debian/Ubuntu: cron (linhagem Vixie, com patches da distribuição)
- RHEL/Fedora: Cronie
- Alpine/containers: BusyBox
crond
O suporte a recursos (strings especiais, comportamento de e-mail, logging) pode diferir. Sempre verifique contra a página de manual local crontab(5).
Cron vs Timers do Systemd
| Consideração | Cron | Timers do Systemd |
|---|---|---|
| Complexidade de configuração | Simples | Mais verboso |
| Tratamento de tarefas perdidas | Ignoradas | Configurável (Persistent=true) |
| Dependências | Nenhuma | Pode aguardar serviços/montagens |
| Logging | Manual | journald integrado |
Use cron quando: Você precisa de agendamento simples e portável que funcione em qualquer lugar.
Use timers do systemd quando: Você precisa de gerenciamento de dependências, agendamento persistente entre reinicializações, ou melhor integração com sistemas Linux modernos. A documentação do projeto systemd sobre unidades de timer é a referência canônica.
Lista de Verificação Rápida para Depuração
- O cron está em execução?
systemctl status cronousystemctl status crond(o nome do serviço varia por distribuição) - Verifique os logs:
grep CRON /var/log/syslog(Debian/Ubuntu) ou/var/log/cron(RHEL/Fedora) - Teste seu comando manualmente com um ambiente restrito
- Verifique caminhos absolutos para todos os comandos e arquivos
- Verifique as permissões de arquivo do seu script
Conclusão
O Cron continua sendo a maneira mais simples de agendar tarefas no Linux. Domine a sintaxe de cinco campos, entenda o comportamento OU ao combinar campos de dia, e considere o comportamento de ambiente específico da distribuição. Com esses fundamentos em vigor, suas tarefas agendadas serão executadas de forma confiável por anos.
Perguntas Frequentes
A causa mais comum são problemas de ambiente. O Cron é executado com um ambiente limitado e não interativo que difere do seu shell, e o comportamento do PATH varia por distribuição. Sempre use caminhos absolutos, defina explicitamente as variáveis necessárias, verifique se o serviço cron está em execução e consulte os logs do sistema para erros.
Use o campo dia da semana com um intervalo de segunda-feira (1) até sexta-feira (5). Por exemplo, para executar às 9h todos os dias úteis use: 0 9 * * 1-5 /path/to/script.sh. Lembre-se que domingo é 0 e sábado é 6 na sintaxe padrão do cron.
Crontabs de usuário são editados com crontab -e e armazenados por usuário. Crontabs do sistema em /etc/cron.d/ incluem um campo adicional de nome de usuário após a especificação de tempo para indicar qual usuário executa o comando. Crontabs do sistema são mais adequados para serviços e administração compartilhada.
Execute seu comando manualmente em um ambiente mínimo que imite o cron. Por exemplo: env -i PATH=/usr/bin:/bin /path/to/script.sh. Isso ajuda a identificar dependências ausentes ou problemas de caminho que de outra forma causariam falhas silenciosas.
Gain control over your UX
See how users are using your site as if you were sitting next to them, learn and iterate faster with OpenReplay. — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.