DevToolPal
UK

Cron-вираз

Останній день щомісяця

У стандартному cron немає позначення останнього дня, тож завдання запускається 28–31 числа, а перевірка в shell пропускає його далі, лише якщо завтра перше число.

0 0 28-31 * * Відкрити в парсері cron-виразів

Рядок crontab використовує GNU date (date -d tomorrow); у macOS використовуйте date -v+1d. Quartz і Spring підтримують L напряму. У Kubernetes і GitHub Actions додайте ту саму перевірку дати на початок завдання.

Розбір за полями

Поле Значення Відповідає
Хвилина 0 0
Година 0 0
День місяця 28-31 28, 29, 30, 31
Місяць * Будь-яке значення
День тижня * Будь-яке значення

Найближчі запуски

Приклад: перші 6 запусків після 1 січня 2026 р. (UTC).

  1. сб, 31 січ. 2026 р., 00:00
  2. сб, 28 лют. 2026 р., 00:00
  3. вт, 31 бер. 2026 р., 00:00
  4. чт, 30 квіт. 2026 р., 00:00
  5. нд, 31 трав. 2026 р., 00:00
  6. вт, 30 черв. 2026 р., 00:00

Готові варіанти

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

Додайте рядок через crontab -e. Завдання виконується в часовому поясі сервера, якщо не задано CRON_TZ або TZ.

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"]

Задайте spec.timeZone (Kubernetes 1.27+); без нього розклад іде за часовим поясом controller manager, зазвичай UTC.

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

GitHub Actions завжди використовує UTC, приймає інтервали від 5 хвилин і під навантаженням може запускати завдання із запізненням.

Quartz
0 0 0 L * ?

У Quartz секунди стоять першими, а в дні місяця чи дні тижня потрібен знак ?. Дні тижня мають номери 1–7 від неділі, тож надійніше писати назви.

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

Spring @Scheduled(cron = …) приймає шість полів: секунди, а потім звичайні п’ять.

Часті запитання

› Чому в crontab % екранують як \%?

У рядку crontab % означає перехід на новий рядок (вхід для команди). Пишіть \%, щоб формат дати дійшов до shell без змін.

› У якому часовому поясі виконується 0 0 28-31 * *?

Cron використовує часовий пояс машини чи сервісу, що його запускає. У Linux це системний пояс, якщо не задано CRON_TZ або TZ; CronJob у Kubernetes підтримує spec.timeZone; GitHub Actions завжди працює в UTC.

› Як перевірити розклад перед розгортанням?

Відкрийте 0 0 28-31 * * у парсері cron-виразів на цьому сайті. Він пояснить кожне поле й покаже найближчі запуски за місцевим часом або в UTC просто в браузері.