DevToolPal
PT

Expressão cron

Último dia de cada mês

O cron padrão não tem símbolo de "último dia", então a tarefa roda nos dias 28–31 e um teste de shell só continua quando amanhã é dia 1.

0 0 28-31 * * Abrir no analisador de expressões cron

A linha do crontab usa GNU date (date -d tomorrow); no macOS use date -v+1d. Quartz e Spring suportam L diretamente. No Kubernetes e no GitHub Actions, adicione a mesma verificação de data no início da tarefa.

Campo a campo

Campo Valor Corresponde a
Minuto 0 0
Hora 0 0
Dia do mês 28-31 28, 29, 30, 31
Mês * Qualquer valor
Dia da semana * Qualquer valor

Próximas execuções

Exemplo: as primeiras 6 execuções após 1 de janeiro de 2026 (UTC).

  1. sáb., 31 de jan. de 2026, 00:00
  2. sáb., 28 de fev. de 2026, 00:00
  3. ter., 31 de mar. de 2026, 00:00
  4. qui., 30 de abr. de 2026, 00:00
  5. dom., 31 de mai. de 2026, 00:00
  6. ter., 30 de jun. de 2026, 00:00

Versões prontas para usar

crontab
0 0 28-31 * * [ "$(date -d tomorrow +\%d)" = 01 ] && /path/to/command

Adicione a linha com crontab -e. Ela roda no fuso horário do servidor, a menos que CRON_TZ ou TZ esteja definido.

Kubernetes CronJob
apiVersion: batch/v1
kind: CronJob
metadata:
  name: last-day-of-month
spec:
  schedule: "0 0 28-31 * *"
  timeZone: "Etc/UTC"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: job
              image: busybox:1.36
              command: ["/bin/sh", "-c", "date; echo run"]

Defina spec.timeZone (Kubernetes 1.27+); sem ele, o agendamento segue o fuso do controller manager, normalmente UTC.

GitHub Actions
on:
  schedule:
    - cron: '0 0 28-31 * *'
  workflow_dispatch:

O GitHub Actions sempre usa UTC, aceita intervalos de 5 minutos ou mais e pode atrasar execuções agendadas sob carga.

Quartz
0 0 0 L * ?

O Quartz coloca os segundos primeiro e exige ? no dia do mês ou no dia da semana. Os dias vão de 1 a 7 começando no domingo, então nomes são mais seguros.

Spring
@Scheduled(cron = "0 0 0 L * *")

O Spring @Scheduled(cron = …) usa seis campos: segundos e depois os cinco de sempre.

Perguntas frequentes

› Por que o % é escapado como \% no crontab?

Numa linha do crontab, % significa quebra de linha (entrada para o comando). Escreva \% para que o formato de data chegue intacto ao shell.

› Em qual fuso horário 0 0 28-31 * * é executado?

O cron usa o fuso horário da máquina ou do serviço que o executa. No Linux é o fuso do sistema, a menos que CRON_TZ ou TZ esteja definido; CronJobs do Kubernetes aceitam spec.timeZone; o GitHub Actions sempre usa UTC.

› Como verificar este agendamento antes de publicar?

Abra 0 0 28-31 * * no analisador de expressões cron deste site. Ele explica cada campo e lista as próximas execuções no seu horário local ou em UTC, tudo no navegador.