OnCalendar= в systemd: расписание таймера
Задаёт расписание срабатывания таймера в календарном виде: дни недели, дата и время. Формат свой, не совпадающий с crontab.
Что делает
Общий вид: ДниНедели Год-Месяц-День Час:Минута:Секунда. Любую часть можно заменить звёздочкой или опустить. Есть сокращения: minutely, hourly, daily, weekly, monthly, yearly.
Проверять запись нужно командой systemd-analyze calendar "выражение": она печатает нормализованный вид и ближайшие срабатывания. Это быстрее и надёжнее, чем перезапускать таймер и ждать.
Где ставится. В секции [Timer]. Можно указать несколько строк — таймер сработает по каждому расписанию.
Значения
| Значение | Что происходит |
|---|---|
daily | каждый день в 00:00. |
*-*-* 03:00:00 | каждый день в три часа ночи. |
Mon..Fri 09:00 | по рабочим дням в девять утра. |
*-*-01 04:00:00 | первого числа каждого месяца. |
*-*-* *:00/15:00 | каждые 15 минут. |
*-*~01 23:00:00 | в последний день месяца. |
Пример
Ночная задача с разбросом и догоном пропущенного.
[Timer]
OnCalendar=*-*-* 03:00:00
RandomizedDelaySec=15min
Persistent=true
[Install]
WantedBy=timers.target
Разброс нужен, когда одинаковые таймеры стоят на десятках машин: иначе все они стучатся в одну секунду.
Типичные ошибки
Формат crontab (0 3 * * *) не разбирается: это другой синтаксис.
Между датой и временем обязателен пробел: запись без него не читается.
Дни недели пишутся сокращениями на латинице, диапазон — двумя точками.
Проверять расписание перезапуском таймера долго: есть systemd-analyze calendar.
Связанные ошибки
- Failed to parse calendar expression: ошибка в OnCalendarsystemd не разбирает календарное выражение таймера. Правила записи OnCalendar и проверка через systemd-analyze calendar.
- Таймер активен, но не срабатываетТаймер systemd в состоянии active, но служба не запускается. Разбор: нет условия срабатывания, таймер не включён, ошибка в OnCalendar.
- Пропущенное срабатывание таймера: Persistent и выключенная машинаТаймер не выполнил задачу, потому что в момент срабатывания машина была выключена или служба была недоступна. Как работает Persistent=true.
Рядом стоящие параметры
Где важен на практике
Источники
- systemd.time(7)
- systemd.timer(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)