O que é o Cron? Uma perspectiva histórica
O Cron é um dos utilitários mais antigos e duradouros do universo Unix. Foi escrito por Ken Thompson como parte do Unix V7 (1979) nos Laboratórios Bell. O nome "cron" vem da palavra grega chronos (χρόνος), que significa "tempo".
O daemon cron original acordava a cada minuto, analisava uma lista de tarefas agendadas e executava aquelas cujo horário havia chegado. Este design elegantemente simples — uma tabela de expressões temporais associadas a comandos — provou ser tão eficaz que se tornou o padrão de facto para agendamento em todos os sistemas Unix. As distribuições Linux modernas incluem descendentes como Vixie Cron (Paul Vixie, 1988), cronie e fcron, enquanto o macOS usa launchd internamente. A influência do cron também se estendeu a frameworks de aplicações: Quartz Scheduler (Java), APScheduler (Python), node-cron (Node.js) e plataformas de nuvem como AWS EventBridge, todas adotam sua sintaxe de expressões.
Sintaxe Padrão de 5 Campos
Uma expressão cron padrão tem cinco campos separados por espaços:
┌───────── minuto (0–59)
│ ┌─────── hora (0–23)
│ │ ┌───── dia do mês (1–31)
│ │ │ ┌─── mês (1–12 ou JAN–DEC)
│ │ │ │ ┌─ dia da semana (0–7 ou SUN–SAT; 0 e 7 = domingo)
│ │ │ │ │
* * * * * comando
Descrição Detalhada de Cada Campo
| Campo | Valores Permitidos | Descrição |
|---|---|---|
| Minuto | 0–59 | O minuto da hora em que a tarefa é executada |
| Hora | 0–23 | A hora do dia (relógio de 24 horas) |
| Dia do mês | 1–31 | O dia do calendário no mês |
| Mês | 1–12 ou JAN–DEC | O mês do ano |
| Dia da semana | 0–7 ou SUN–SAT | O dia da semana (0 e 7 = domingo) |
Importante: Quando tanto o dia do mês quanto o dia da semana são diferentes de *, o cron usa lógica OU — se qualquer uma das condições corresponder, o trabalho é executado. Isto surpreende muitos iniciantes.
Sintaxe Estendida de 6 Campos (com Segundos)
Alguns schedulers — notavelmente Quartz Scheduler (Java), Spring Framework e várias plataformas de nuvem — adicionam um campo de segundos no início:
┌─────────── segundo (0–59)
│ ┌───────── minuto (0–59)
│ │ ┌─────── hora (0–23)
│ │ │ ┌───── dia do mês (1–31)
│ │ │ │ ┌─── mês (1–12)
│ │ │ │ │ ┌─ dia da semana (1–7 no Quartz; 1=domingo)
│ │ │ │ │ │
0 * * * * ?
Note que o Quartz numera os dias da semana de forma diferente (1=domingo, 7=sábado), ao contrário do Unix cron onde 0 e 7 representam ambos domingo.
Caracteres Especiais Explicados
* — Qualquer Valor
Corresponde a todos os valores possíveis daquele campo. * * * * * é executado a cada minuto.
, — Lista de Valores
Especifica múltiplos valores discretos. 0 9,12,18 * * * é executado todos os dias às 9h, 12h e 18h.
- — Intervalo
Especifica um intervalo inclusivo. 0 9-17 * * 1-5 é executado a cada hora entre 9h e 17h, de segunda a sexta.
/ — Valores de Passo
*/n significa "a cada n unidades". */15 * * * * é executado a cada 15 minutos. Combinável com intervalos: 10-50/10 significa 10, 20, 30, 40, 50.
? — Sem Valor Específico (apenas Quartz/Spring)
Usado no campo dia do mês ou dia da semana para indicar "não importa". Como especificar ambos os campos é ambíguo, um deles deve ser ?.
L — Último (apenas Quartz/Spring)
No dia do mês: último dia do mês. No dia da semana: última ocorrência daquele dia no mês. 0 0 L * ? é executado no último dia de cada mês à meia-noite.
W — Dia Útil Mais Próximo (apenas Quartz/Spring)
15W no dia do mês significa o dia útil mais próximo do dia 15. Se o dia 15 cair num sábado, a tarefa é executada na sexta-feira 14; se for domingo, na segunda-feira 16.
# — Enésima Ocorrência do Dia da Semana (apenas Quartz/Spring)
2#3 significa a terceira terça-feira do mês. Formato: <dia>#<ocorrência>. 0 10 ? * 2#1 é executado na primeira segunda-feira de cada mês às 10h.
Aliases de Tempo Especiais
A maioria das implementações cron suporta os seguintes atalhos convenientes:
| Alias | Equivalente | Descrição |
|---|---|---|
@yearly |
0 0 1 1 * |
Uma vez por ano, em 1º de janeiro à meia-noite |
@annually |
0 0 1 1 * |
Igual a @yearly |
@monthly |
0 0 1 * * |
No primeiro dia de cada mês à meia-noite |
@weekly |
0 0 * * 0 |
Todo domingo à meia-noite |
@daily |
0 0 * * * |
Todo dia à meia-noite |
@midnight |
0 0 * * * |
Igual a @daily |
@hourly |
0 * * * * |
A cada hora no minuto 0 |
@reboot |
— | Uma vez na inicialização do sistema |
Exemplos Comuns de Expressões Cron
| Expressão | Significado |
|---|---|
* * * * * |
A cada minuto |
0 * * * * |
A cada hora (no minuto 0) |
*/15 * * * * |
A cada 15 minutos |
0 0 * * * |
Todo dia à meia-noite |
30 2 * * * |
Todo dia às 2h30 |
0 9-17 * * 1-5 |
A cada hora das 9h às 17h, dias úteis |
0 0 * * 0 |
Todo domingo à meia-noite |
0 0 1 * * |
No primeiro dia de cada mês à meia-noite |
0 0 1 1 * |
Em 1º de janeiro à meia-noite (uma vez por ano) |
0 6 * * 1-5 |
Dias úteis às 6h |
0 */6 * * * |
A cada 6 horas |
Trabalhando com Crontab no Linux
# Editar seu crontab pessoal
crontab -e
# Listar entradas do crontab atual
crontab -l
# Remover completamente o crontab
crontab -r
# Editar o crontab de outro usuário (apenas root)
crontab -u nomeusuario -e
Exemplo de Arquivo Crontab
# Variáveis de ambiente no início
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
[email protected]
# Executar backup todo dia às 2h30
30 2 * * * /usr/local/bin/backup.sh
# Limpeza todo domingo à meia-noite, com registro
0 0 * * 0 /usr/local/bin/cleanup.sh >> /var/log/cleanup.log 2>&1
# Verificação de saúde a cada 15 minutos
*/15 * * * * /usr/local/bin/health-check.sh
# Cron com fuso horário (extensão GNU cron / cronie)
CRON_TZ=America/Sao_Paulo
0 9 * * 1-5 /usr/local/bin/relatorio-matutino.sh
Diretórios Cron a Nível do Sistema
/etc/crontab— crontab do sistema com campo de nome de usuário adicional/etc/cron.d/— arquivos cron individuais para pacotes e serviços/etc/cron.daily/,/etc/cron.hourly/,/etc/cron.weekly/,/etc/cron.monthly/— scripts aqui são executados com aquelas frequências viarun-parts
Cron no macOS e Windows
macOS: launchd
O macOS deprecou o daemon cron em favor do launchd. Embora o cron ainda funcione, a Apple prefere arquivos .plist em ~/Library/LaunchAgents/ (tarefas do usuário) ou /Library/LaunchDaemons/ (tarefas do sistema). Muitos desenvolvedores ainda usam cron pela sua simplicidade.
Windows: Agendador de Tarefas
O Windows usa o Agendador de Tarefas (schtasks) com sua própria configuração XML. O WSL (Subsistema Windows para Linux) oferece um ambiente Linux completo com cron nativo.
Schedulers a Nível de Aplicação
Node.js — node-cron
const cron = require('node-cron');
// Agendar às 2h30 da manhã com fuso horário
cron.schedule('30 2 * * *', async () => {
await executarBackupDiario();
}, {
timezone: "America/Sao_Paulo"
});
Python — APScheduler
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
scheduler = BlockingScheduler()
@scheduler.scheduled_job(CronTrigger.from_crontab('0 9 * * 1-5'))
def tarefa_matutina():
print("Bom dia! É um dia útil.")
scheduler.start()
Java — Quartz Scheduler
O Quartz usa expressões de 6 campos (segundo, minuto, hora, dia do mês, mês, dia da semana) e suporta os caracteres avançados (L, W, #, ?).
// Quartz: todo dia útil às 9h00
CronScheduleBuilder schedule = CronScheduleBuilder.cronSchedule("0 0 9 ? * MON-FRI");
Schedulers Cloud e Contêineres
AWS EventBridge Scheduler
Suporta expressões cron de 6 campos (UTC). O campo dia do mês ou dia da semana deve ser ?:
cron(0 2 * * ? *) # Todo dia às 2h UTC
Google Cloud Scheduler
Usa a sintaxe Unix padrão de 5 campos com suporte a fuso horário.
Kubernetes CronJob
apiVersion: batch/v1
kind: CronJob
metadata:
name: backup-diario
spec:
schedule: "0 2 * * *"
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: backup-image:latest
restartPolicy: OnFailure
concurrencyPolicy: Forbid evita que execuções se sobreponham se uma tarefa demorar mais que seu intervalo.
Tratamento de Fusos Horários
O cron é executado no fuso horário do sistema, que em servidores costuma ser UTC. Uma tarefa agendada para 0 9 * * * num servidor UTC será executada às 9h UTC, o que pode ser 6h ou 13h no horário do usuário, dependendo do fuso.
Boas práticas para fusos horários:
- Usar
CRON_TZ=America/Sao_Paulono crontab para especificar explicitamente o fuso - Aproveitar os campos de fuso horário em plataformas cloud (GCP Cloud Scheduler, Kubernetes
spec.timeZone) - Preferir horários UTC fixos para evitar problemas com horário de verão (DST):
0 2 * * *pode ser executado duas vezes ou não ser executado durante as transições de DST - Sempre documentar nos comentários qual fuso corresponde a cada expressão cron
Considerações de Segurança
As tarefas cron geralmente são executadas com privilégios elevados e são uma superfície de ataque comum.
Princípio do menor privilégio: Executar com o usuário que tem os mínimos privilégios necessários, evitando o root.
Sem credenciais no código: Nunca incluir senhas, chaves de API ou tokens diretamente em entradas crontab ou scripts. Usar arquivos de variáveis de ambiente com permissões restritas (chmod 600) ou gerenciadores de segredos (AWS Secrets Manager, HashiCorp Vault).
Permissões de scripts: Garantir que os scripts cron não sejam modificáveis por outros usuários.
chmod 750 /usr/local/bin/backup.sh
chown root:staff /usr/local/bin/backup.sh
Monitoramento e alertas: Usar MAILTO= para receber erros por e-mail; serviços como Healthchecks.io ou Cronitor alertam quando uma tarefa não é executada conforme o esperado.
Boas Práticas
Projetar tarefas idempotentes: Uma tarefa que pode ser executada múltiplas vezes com o mesmo resultado facilita a recuperação após falhas.
Usar bloqueio de arquivo para evitar sobreposições: Para tarefas longas, usar flock:
*/5 * * * * flock -n /var/lock/myjob.lock /usr/local/bin/myjob.sh
Redirecionar saída explicitamente:
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Verificar expressões antes de implantar: Usar a ferramenta Cron Parser para confirmar exatamente quando uma expressão é acionada.
Versionar crontabs: Armazenar arquivos crontab no Git junto com código de infraestrutura e implantá-los com Ansible ou Puppet para evitar "desvio de configuração".
Perguntas Frequentes (FAQ)
P: Por que minha tarefa cron não está sendo executada?
As causas mais comuns são: (1) permissões de execução incorretas no script, (2) o script depende de variáveis de ambiente não disponíveis no ambiente mínimo do cron, (3) problemas com PATH — o cron não carrega a configuração do shell, usar caminhos absolutos, (4) o daemon cron não está em execução (systemctl status cron).
P: Qual é a diferença entre */5 e 0/5?
No cron Unix padrão, */5 significa a cada 5 minutos começando do 0 (0, 5, 10, ..., 55). 0/5 não é sintaxe Unix cron padrão, mas é usada no Quartz/AWS com o mesmo significado.
P: O cron pode executar uma tarefa a cada segundo?
A granularidade mínima do cron padrão é de um minuto. Para agendamento sub-minuto, usar schedulers de aplicação como Quartz, APScheduler com triggers de intervalo, ou timers systemd.
P: Como executar uma tarefa no último dia do mês?
O cron padrão não tem operador nativo para "último dia". A solução comum: verificar se o dia seguinte é o dia 1. No Quartz cron, usar L no campo dia do mês.
P: Qual é a diferença entre 0 0 * * 0 e @weekly?
São equivalentes: ambos são executados à meia-noite no domingo. @weekly é um alias mnemônico definido na maioria das implementações modernas de cron.
P: Como depurar um script que funciona no terminal mas falha no cron?
O cron é executado com um ambiente mínimo (normalmente apenas HOME, LOGNAME, PATH=/usr/bin:/bin, SHELL=/bin/sh). Adicionar #!/bin/bash e set -e ao script, usar caminhos absolutos para todos os comandos e redirecionar stdout/stderr para um arquivo de log.
Resumo
O Cron tem impulsionado a automação Unix desde 1979 e permanece o mecanismo de agendamento mais utilizado atualmente. Seja gerenciando um único servidor Linux, orquestrando cargas de trabalho no Kubernetes ou configurando gatilhos de eventos na nuvem, entender profundamente a sintaxe cron economizará horas de depuração e prevenirá erros de agendamento custosos.
Pontos-chave:
- A sintaxe padrão de 5 campos cobre a grande maioria dos casos de uso
- Usar
/para passos,,para listas,-para intervalos - Sempre considerar o fuso horário — preferir UTC em servidores ou especificar
CRON_TZexplicitamente - Aplicar princípios de segurança: menor privilégio, sem credenciais no código, monitoramento
- Verificar expressões com uma ferramenta de parsing antes de implantar em produção
Visão Geral
As tarefas cron são o coração da automação moderna, mas sua sintaxe pode ser intimidante até mesmo para administradores de sistema experientes. Nosso Analisador de Cron Online foi projetado para eliminar as suposições do agendamento. Ao traduzir expressões cron crípticas em uma linguagem clara e legível por humanos, esta ferramenta garante que suas tarefas agendadas sejam executadas exatamente quando você pretendia. Esteja você gerenciando backups, scripts de limpeza ou e-mails automatizados, a precisão é fundamental.
Principais Recursos
- Tradução em Tempo Real: Veja instantaneamente o que sua expressão cron significa em português simples.
- Próximas Execuções: Visualize uma lista das próximas 5 ou mais execuções agendadas para verificar sua lógica.
- Suporte para Todos os Campos: Lida com formatos cron padrão, incluindo variações de 6 campos (segundos) e 7 campos (anos).
- Destaque de Sintaxe: Pistas visuais ajudam você a identificar minutos, horas, dias, meses e semanas.
Como Usar
- Entrada: Cole ou digite sua expressão cron no campo principal.
- Observação: A tradução legível por humanos é atualizada automaticamente conforme você digita.
- Verificação: Verifique a lista de "Próximas execuções" para garantir que ela atenda aos seus requisitos.
- Cópia: Use os exemplos fornecidos se estiver começando do zero.
Casos de Uso Comuns
- Manutenção de Servidor: Agendamento de backups noturnos de banco de dados ou rotações de log.
- Desenvolvimento Web: Configuração de tarefas recorrentes em segundo plano em frameworks como Laravel ou Django.
- DevOps: Configuração de pipelines de CI/CD e verificações de saúde automatizadas.
- Produtividade Pessoal: Gerenciamento de lembretes recorrentes ou execuções de scripts em máquinas locais.
Contexto Técnico
As expressões cron consistem em 5 a 7 campos separados por espaços em branco. Cada campo representa uma unidade de tempo: Minuto, Hora, Dia do Mês, Mês e Dia da Semana. Nosso analisador usa um mecanismo lógico robusto que lida com caracteres especiais como * (qualquer), , (lista), - (intervalo), / (incremento) e L (último). Ele calcula com precisão as próximas ocorrências considerando anos bissextos e durações dos meses.
Perguntas Frequentes
- Suporta segundos? Sim, suporta expressões cron de 6 campos que incluem segundos.
- Pode lidar com aliases não padrão como @daily? Sim, aliases comuns são suportados.
- Leva em conta o fuso horário? Por padrão, os cálculos são baseados em UTC, mas você pode ajustar sua perspectiva de acordo.
Limitações
- Variações de Implementação: Diferentes sistemas (por exemplo, Quartz, AWS, Jenkins) têm pequenas variações na sintaxe cron; sempre verifique com sua plataforma específica.
- Casos de Borda: "Último dia do mês" (L) e "Dia útil mais próximo" (W) podem se comportar de maneira diferente dependendo do sistema operacional.