DevToolPal
DE

Cron-Ausdruck

Am letzten Tag jedes Monats

Standard-cron kennt kein Zeichen für den letzten Tag. Der Job läuft daher an den Tagen 28–31, und ein Shell-Test lässt ihn nur weiterlaufen, wenn morgen der 1. ist.

0 0 28-31 * * Im Cron-Parser öffnen

Die crontab-Zeile nutzt GNU date (date -d tomorrow); unter macOS verwenden Sie date -v+1d. Quartz und Spring unterstützen L direkt. In Kubernetes und GitHub Actions bauen Sie dieselbe Datumsprüfung an den Anfang des Jobs.

Feld für Feld

Feld Wert Trifft zu auf
Minute 0 0
Stunde 0 0
Tag des Monats 28-31 28, 29, 30, 31
Monat * Jeder Wert
Wochentag * Jeder Wert

Nächste Ausführungen

Beispiel: die ersten 6 Ausführungen nach dem 1. Januar 2026 (UTC).

  1. Sa., 31. Jan. 2026, 00:00
  2. Sa., 28. Feb. 2026, 00:00
  3. Di., 31. März 2026, 00:00
  4. Do., 30. Apr. 2026, 00:00
  5. So., 31. Mai 2026, 00:00
  6. Di., 30. Juni 2026, 00:00

Fertige Varianten

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

Fügen Sie die Zeile mit crontab -e hinzu. Sie läuft in der Zeitzone des Servers, sofern CRON_TZ oder TZ nicht gesetzt ist.

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

Setzen Sie spec.timeZone (Kubernetes 1.27+); sonst gilt die Zeitzone des Controller Managers, meist UTC.

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

GitHub Actions verwendet immer UTC, erlaubt Intervalle ab 5 Minuten und startet geplante Läufe bei hoher Last eventuell verspätet.

Quartz
0 0 0 L * ?

Quartz stellt die Sekunden voran und braucht ? entweder im Tag des Monats oder im Wochentag. Die Tage zählen 1–7 ab Sonntag, Namen sind daher sicherer.

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

Spring @Scheduled(cron = …) erwartet sechs Felder: Sekunden und dann die üblichen fünf.

FAQ

› Warum wird % in der crontab als \% geschrieben?

In einer crontab-Zeile bedeutet % einen Zeilenumbruch (Eingabe für den Befehl). Mit \% kommt das Datumsformat unverändert in der Shell an.

› In welcher Zeitzone läuft 0 0 28-31 * *?

Cron verwendet die Zeitzone der Maschine oder des Dienstes, der ihn ausführt. Unter Linux ist das die Systemzeitzone, sofern CRON_TZ oder TZ nicht gesetzt ist; Kubernetes-CronJobs akzeptieren spec.timeZone; GitHub Actions nutzt immer UTC.

› Wie prüfe ich den Zeitplan vor dem Deployment?

Öffnen Sie 0 0 28-31 * * im Cron-Parser dieser Website. Er erklärt jedes Feld und listet die nächsten Ausführungen in Ihrer Ortszeit oder in UTC auf, direkt im Browser.