OnCalendar-Syntax
Das Format ist [Wochentag] Datum Zeit, jeder Teil optional: Mon..Fri *-*-* 06:30:00. Wochentage nutzen dreibuchstabige Namen mit ..-Bereichen und Kommas. Das Datum ist YYYY-MM-DD mit * für beliebig; die Zeit ist HH:MM:SS (Sekunden standardmäßig 00). Jedes Feld akzeptiert Listen (1,15), Bereiche (8..18) und Schritte (*/15 oder 0/15, 8..18/2). Kürzel: minutely, hourly, daily, weekly, monthly, yearly, quarterly. Ein Zonenname am Ende wendet den Ausdruck in dieser Zone an (*-*-* 09:00 Europe/Berlin).
| Cron | OnCalendar |
|---|---|
| */5 * * * * | *-*-* *:*/5:00 |
| 0 * * * * | hourly |
| 30 6 * * 1-5 | Mon..Fri *-*-* 06:30:00 |
| 0 9 1 * * | *-*-01 09:00:00 |
| 0 3 * * 0 | Sun *-*-* 03:00:00 |
| 0 0 L * * | *-*~01 00:00:00 (letzter Tag des Monats: ~ zählt vom Ende) |
Was Timer können und Cron nicht
- Persistent=true: War der Rechner aus, als der Timer hätte feuern sollen, läuft er beim nächsten Start. Cron verpasst ihn einfach (dafür gibt es anacron).
- RandomizedDelaySec=: Läufe über ein Fenster streuen, damit eine Flotte den Server nicht in derselben Sekunde trifft.
- AccuracySec=: standardmäßig eine Minute; setzen Sie
1s, wenn die exakte Zeit zählt, oder länger, um Aufwachvorgänge zu bündeln und Strom zu sparen. - Logs gehen ins Journal (
journalctl -u name.service), der Job läuft mit Sandboxing, Abhängigkeiten und Ressourcenlimits des Service, undsystemctl list-timerszeigt nächste und letzte Läufe.
Einen Ausdruck prüfen
systemd-analyze calendar "Mon..Fri *-*-* 06:30" gibt die normalisierte Form und den nächsten Lauf aus, was diese Seite nachbildet. Nach dem Installieren eines Timers: systemctl daemon-reload && systemctl enable --now name.timer, dann systemctl list-timers --all.
Fragen
Warum läuft mein Timer einmal und nie wieder?
Meist wurde der Timer gestartet, aber nicht aktiviert (systemctl enable --now name.timer), oder der ausgelöste Service ist ein oneshot ohne passende Timer-Unit. Prüfen Sie systemctl list-timers und journalctl -u name.timer.
Wie lasse ich einen Timer als normaler Benutzer laufen?
Legen Sie die Units in ~/.config/systemd/user/ ab, nutzen Sie systemctl --user und führen Sie loginctl enable-linger $USER aus, damit sie ohne aktive Login-Sitzung feuern.
Nutzt OnCalendar die Systemzeitzone?
Ja, sofern der Ausdruck nicht mit einem Zonennamen endet, was systemd 243+ unterstützt. Container- und Cloud-Images laufen meist in UTC; setzen Sie die Zone explizit, wenn der Zeitplan in Ortszeit gemeint ist.
Wie drücke ich „jeden Werktag um 9 und 17 Uhr“ aus?
Mon..Fri *-*-* 09,17:00:00. Listen funktionieren in jedem Feld.