FlowingDev

Expressões cron, explicadas: a linguagem dos agendadores para controlar o tempo

Aprenda como as expressões cron, a pequena mas poderosa linguagem de agendamento, dizem aos computadores quando executar tarefas automatizadas, de backups a newsletters.

Testar a ferramenta: Parser de Expressão Cron

Em uma frase

Uma expressão cron é uma string compacta de caracteres que define um agendamento recorrente, basicamente dizendo a um computador quando executar uma tarefa automatizada.

O problema que ele resolve

Lá na idade das trevas digital (os anos 70), se você quisesse que um computador fizesse algo automaticamente — digamos, limpar arquivos temporários à meia-noite — você tinha que ser criativo. Você poderia escrever um script desajeitado que rodava em loop, checava a hora e depois "dormia" por um tempo. Era bagunçado, ineficiente e propenso a quebrar.

Eis que surge o cron, um daemon (um processo em segundo plano) nascido nos corredores do Bell Labs, nos primórdios do Unix. O nome é uma referência a Chronos, a personificação grega do tempo, o que é o mais geek possível. O trabalho do Cron era simples, mas revolucionário: ler uma lista de comandos e os horários em que deveriam ser executados, e então executá-los. Era um sistema "configure e esqueça" para automação de tarefas.

Para dizer ao cron quando executar as coisas, ele precisava de uma linguagem. Não uma linguagem verbosa, parecida com o inglês, mas algo que um computador pudesse analisar instantaneamente. Essa linguagem é a expressão cron. Ela resolve o problema fundamental de como descrever qualquer agendamento recorrente imaginável — "toda segunda-feira às 9h", "no 1º e 15º dia de cada mês", "a cada 10 minutos" — de uma forma padronizada e previsível. Sem ela, todo desenvolvedor estaria reinventando a roda do agendamento, e seu servidor seria uma bagunça caótica de comandos sleep() improvisados.

Como funciona por baixo dos panos

Uma expressão cron parece uma sequência de caracteres sem sentido para os não iniciados, algo como */15 9-17 * * 1-5. Mas não é mágica; é uma minilinguagem altamente estruturada. Uma vez que você aprende a sintaxe, consegue ler e escrever agendamentos como um profissional.

Os Cinco Campos do Apocalipse (e amigos)

Uma expressão cron padrão é composta por cinco campos, separados por espaços. Cada campo representa uma unidade de tempo. Pense nisso como um conjunto de cinco mostradores que você gira para alinhar o momento correto.

Campo Valores Permitidos Caracteres Especiais Permitidos
Minuto 0-59 * , - /
Hora 0-23 * , - /
Dia do Mês 1-31 * , - / ? L W
Mês 1-12 ou JAN-DEZ * , - /
Dia da Semana 0-7 ou DOM-SAB * , - / ? L #

Algumas implementações modernas de cron adicionam um sexto campo para o ano (1970-2099) ou até mesmo um campo principal para segundos (0-59), mas o formato clássico de cinco campos é o mais comum.

Uma nota sobre o Dia da Semana: Tanto 0 quanto 7 são frequentemente aceitos para Domingo. Manter uma convenção (como 0=Dom, 6=Sáb) é uma boa ideia.

Caracteres Especiais: A Linguagem Secreta

O verdadeiro poder das expressões cron vem de um punhado de caracteres especiais que modificam os números.

  • * (O "todos"): Este é o curinga. Um asterisco no campo Hora significa "a cada hora do dia". Um asterisco em todos os campos (* * * * *) significa "a cada minuto de cada hora de cada dia de cada mês...". Você entendeu.

  • , (O "e"): A vírgula atua como um separador de lista. 1,15 no campo Dia do Mês significa "no 1º e no 15º dia do mês."

  • - (O "através"): O hífen define um intervalo. 9-17 no campo Hora significa "a cada hora das 9h às 17h."

  • / (O "passo"): A barra é usada para especificar incrementos. */10 no campo Minuto significa "a cada 10 minutos". Você também pode combiná-la com um intervalo: 0-30/5 significa "a cada 5 minutos nos primeiros 30 minutos da hora" (ou seja, às :00, :05, :10, :15, :20, :25, :30).

  • ? (O "não me importo"): Este é um pouco complicado, mas importante. Você não pode sempre especificar ambos um Dia do Mês e um Dia da Semana porque eles podem entrar em conflito. O que acontece se você disser "execute no dia 13 do mês e em uma sexta-feira", mas o dia 13 cair em uma quarta-feira? O ? resolve isso dizendo: "Eu já especifiquei um desses campos, então ignore o outro." Você definiria o agendamento como * * 13 * ? (execute no dia 13, não me importo com o dia da semana) ou * * ? * 5 (execute toda sexta-feira, não me importo com o dia do mês).

  • L (O "último"): L no campo Dia do Mês significa "o último dia do mês" (ou seja, 31 de Jan, 28/29 de Fev, etc.). No campo Dia da Semana, significa "o último X do mês". Por exemplo, 5L significa "a última sexta-feira do mês."

  • W (O "dia de semana"): 15W no campo Dia do Mês significa "o dia de semana mais próximo do dia 15 do mês". Se o dia 15 for um sábado, a tarefa rodará na sexta-feira, dia 14. Se o dia 15 for um domingo, rodará na segunda-feira, dia 16.

  • # (O "enésimo"): Este é para encontrar coisas como "a terceira sexta-feira do mês". A expressão para isso seria * * ? * 5#3.

Juntando tudo

Vamos decodificar algumas expressões comuns:

# Executa toda noite à meia-noite
0 0 * * *
  • 0 no campo minuto: no minuto zero (o topo da hora).
  • 0 no campo hora: na hora zero (meia-noite).
  • * * * nos outros campos: a cada dia de cada mês de cada semana.
# Executa às 8:30 da manhã em todos os dias da semana (Seg-Sex)
30 8 * * 1-5
  • 30 no campo minuto: aos 30 minutos da hora.
  • 8 no campo hora: às 8h da manhã.
  • * * para dia do mês e mês: não importa.
  • 1-5 para dia da semana: de segunda a sexta-feira.
# Executa a cada 15 minutos durante o horário comercial (9h-17h) nos dias de semana
*/15 9-17 * * 1-5
  • */15: a cada 15 minutos.
  • 9-17: para as horas 9, 10, 11, 12, 13, 14, 15, 16 e 17.
  • 1-5: de segunda a sexta-feira.

Histórias do mundo real

O Caso do Backup da Meia-noite

O banco de dados de uma startup estava crescendo rápido. O sysadmin principal sabia que precisavam de backups diários, mas rodar o script de backup durante o dia deixava a aplicação inteira lenta como uma carroça. Os usuários reclamavam e vendas potenciais eram perdidas. A solução? Um simples job de cron. Ele agendou o script de backup, que consumia muitos recursos, para rodar às 2 da manhã, quando o tráfego do site era praticamente zero. A expressão 0 2 * * * se tornou o herói silencioso da empresa, garantindo que seus dados estivessem seguros sem atrapalhar um único usuário. Lição: Agende tarefas que consomem muitos recursos para horários de baixo pico para manter o desempenho.

A Newsletter Esquecida

Um pequeno site de e-commerce queria enviar um e-mail de "Ofertas da Semana" toda terça-feira de manhã para impulsionar as vendas. Durante meses, uma pessoa do marketing chamada Dave foi encarregada de clicar manualmente em "Enviar" às 10h. Mas uma semana, o Dave ficou doente. A newsletter nunca foi enviada, e as vendas daquela terça-feira foram péssimas. A desenvolvedora principal entrou em cena e automatizou o processo. Ela escreveu um script para enviar a newsletter e o conectou a um job de cron: 0 10 * * 2. A partir de então, a newsletter era enviada pontualmente, independentemente de quem estivesse no escritório. Lição: Automatize tarefas repetitivas e sensíveis ao tempo para melhorar a confiabilidade e eliminar o erro humano.

O Cache Desatualizado

Um site de notícias se orgulhava de dar furos de reportagem, mas sua página inicial muitas vezes parecia lenta. O conteúdo era armazenado em cache para melhorar o desempenho, mas o cache só era limpo quando um desenvolvedor o fazia manualmente. Isso significava que novos artigos às vezes levavam horas para aparecer. Um desenvolvedor configurou um job de cron para limpar e reconstruir automaticamente o cache do site a cada cinco minutos. Com a expressão */5 * * * *, o site ficou dramaticamente mais rápido e mais atualizado, pois o novo conteúdo era garantido de estar visível em poucos minutos. Lição: Use o cron para tarefas periódicas de "manutenção" (housekeeping) como invalidação de cache para manter os sistemas atualizados e com bom desempenho.

Erros e armadilhas comuns

  • Problemas com Fuso Horário: Um clássico problema de "roda na hora errada". Os jobs de cron quase sempre rodam usando o horário do sistema do servidor, que pode ser UTC ou algum outro fuso horário que não é o seu. Agendar um job para 9 da manhã no seu fuso pode significar que ele rodará às 14h no horário do servidor. Esteja sempre ciente do fuso horário do seu servidor.

  • O Conflito entre Dia do Mês vs. Dia da Semana: Um erro comum de iniciante é colocar um valor tanto no campo Dia do Mês quanto no Dia da Semana (ex: * * 1 FRI). A maioria dos daemons cron interpreta isso com uma condição OR: "execute no 1º dia do mês OU em qualquer sexta-feira." Isso raramente é o que você quer. Se você quer "a primeira sexta-feira do mês", precisa usar * * ? * 5#1 ou um script mais complexo. Use o caractere ? para evitar ambiguidades.

  • Esquecer o Redirecionamento de Saída: Por padrão, qualquer coisa que seu script imprime na saída padrão (standard output) ou erro padrão (standard error) é enviada por e-mail para o usuário dono do crontab. Isso parece útil, mas pode encher rapidamente uma caixa de e-mail com notificações inúteis. A melhor prática é tratar explicitamente a saída: envie-a para um arquivo de log (>> /var/log/myjob.log 2>&1) ou descarte-a se não for importante (> /dev/null 2>&1).

  • O Trabalho Sobreposto: Definir um job para * * * * * significa "iniciar uma nova instância deste job no início de cada minuto". Se o seu job leva 90 segundos para ser executado, você terá execuções sobrepostas, o que pode levar a condições de corrida (race conditions), esgotamento de recursos e todo tipo de caos.

  • O Ambiente Minimalista: Seu shell interativo é cheio de variáveis de ambiente úteis como $PATH. Um job do cron roda em um ambiente árido e simplificado. Seu script que roda perfeitamente na linha de comando pode falhar no cron porque não consegue encontrar programas como node ou python. A correção é usar caminhos absolutos para todos os comandos (ex: /usr/bin/node em vez de node) ou definir a variável PATH no topo do seu arquivo crontab.

Por que isso deve estar no seu radar

Você pode pensar que o cron é só para administradores de sistema da velha guarda, mas seu DNA está por toda parte.

  • Backend & DevOps: É o padrão de fato para agendar tarefas em segundo plano, desde manutenção de banco de dados e rotação de logs até o deploy de código.
  • Desenvolvimento Web: Precisa enviar relatórios diários por e-mail, limpar um cache ou gerar um sitemap? O cron é a sua ferramenta.
  • Plataformas de Nuvem: Serviços como AWS Lambda Scheduled Events e Google Cloud Scheduler usam expressões cron para definir seus gatilhos. A sintaxe é uma linguagem universal para agendamento, mesmo nos ambientes mais modernos e "serverless".

Aprender a ler e escrever expressões cron é uma habilidade fundamental. É a chave que destrava a automação, permitindo que você construa sistemas mais robustos, confiáveis e autossuficientes. É uma daquelas pequenas coisas que, uma vez que você aprende, você vê oportunidades de usá-la em todos os lugares.

Para ir mais a fundo

Teoria feita. Hora de pôr a mão na massa — 100% no seu navegador.

Testar a ferramenta: Parser de Expressão Cron