Pular para o conteúdo

Expressões cron

automacao
┌───────────── minuto (0-59)
│ ┌─────────── hora (0-23)
│ │ ┌───────── dia do mês (1-31)
│ │ │ ┌─────── mês (1-12 ou JAN-DEC)
│ │ │ │ ┌───── dia da semana (0-6, domingo=0; ou SUN-SAT)
│ │ │ │ │
* * * * *
Símbolo Significado Exemplo
* Qualquer valor * * * * * = a cada minuto
, Lista 0 8,12,18 * * *
- Intervalo 0 9-18 * * *
/ Passo */15 * * * * = a cada 15 min
L Último (nem todo cron suporta) 0 3 L * *
Expressão Quando
*/5 * * * * A cada 5 minutos
0 * * * * A cada hora, no minuto 0
0 3 * * * Todo dia às 3h
0 3 * * 1-5 Dias úteis às 3h
0 3 * * 0 Domingos às 3h
30 2 1 * * Dia 1 de cada mês, 2h30
0 0 1 1 * 1º de janeiro
*/10 8-18 * * 1-5 A cada 10 min, horário comercial, dias úteis
0 */6 * * * A cada 6 horas
15 4 * * 6 Sábados às 4h15

Suportada por muitas implementações (Vixie cron, Kubernetes):

Atalho Equivale a
@yearly / @annually 0 0 1 1 *
@monthly 0 0 1 * *
@weekly 0 0 * * 0
@daily / @midnight 0 0 * * *
@hourly 0 * * * *
@reboot No início do sistema (não é agendamento)

Alguns sistemas (Quartz, EventBridge) usam seis ou sete campos, com segundos e/ou ano. Confirme o dialeto antes de copiar expressão.

apiVersion: batch/v1
kind: CronJob
metadata: { name: relatorio, namespace: loja }
spec:
schedule: "0 6 * * *"
timeZone: "America/Sao_Paulo" # a partir do Kubernetes 1.27
concurrencyPolicy: Forbid # não sobrepõe execuções
startingDeadlineSeconds: 300 # desiste se atrasar mais que isso
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 3
jobTemplate:
spec:
backoffLimit: 2
activeDeadlineSeconds: 3600 # mata o job que travou
template:
spec:
restartPolicy: OnFailure
containers:
- name: relatorio
image: registry.exemplo.com/relatorio@sha256:SUBSTITUA
concurrencyPolicy Comportamento
Allow (padrão) Permite execuções simultâneas
Forbid Pula a nova se a anterior ainda roda
Replace Mata a anterior e inicia a nova

Sem Forbid, um job que demora mais que o intervalo acumula execuções sobrepostas — causa clássica de sobrecarga e de dados duplicados.

O ponto que mais causa engano: cron do sistema usa o fuso do host; muitos serviços gerenciados usam UTC.

O Brasil não adota horário de verão desde 2019, então America/Sao_Paulo é UTC−3 o ano todo. Ainda assim, deixe o fuso explícito:

Janela do terminal
# na crontab do sistema
CRON_TZ=America/Sao_Paulo
0 3 * * * /usr/local/bin/backup.sh

Conversão rápida para quem precisa escrever em UTC: hora BRT + 3 = UTC. 20h BRT = 23:00 UTC; 2h BRT = 05:00 UTC.

Em serviços que não aceitam fuso (versões antigas do CronJob, algumas nuvens), escreva em UTC e comente a hora local ao lado.

Janela do terminal
crontab -l # sua crontab
crontab -e # editar
crontab -u app -l # de outro usuário
ls /etc/cron.d/ # crontabs do sistema
grep CRON /var/log/syslog # execuções (Debian/Ubuntu)
journalctl -u cron -f # em systemd
# valide a expressão antes de publicar
systemd-analyze calendar "*-*-* 03:00:00"
  • Dia do mês e dia da semana são OU, não E. 0 3 1 * 1 executa no dia 1 e em toda segunda-feira.
  • % na crontab significa nova linha; escape com \% (comum ao usar date +%F).
  • O PATH no cron é mínimo: use caminhos absolutos ou defina PATH no topo.
  • Cron não carrega o perfil do shell — variáveis de ambiente do seu .bashrc não existem.
  • Sem redirecionar saída, o cron tenta enviar e-mail; use >> /var/log/job.log 2>&1.
  • Job sem trava pode sobrepor: use flock -n /tmp/job.lock comando.
  • @reboot não é agendamento periódico.
  • Em containers, o processo do cron precisa ser o PID 1 e receber sinais — quase sempre é melhor usar CronJob ou timer do systemd.