bitlvl
RU

Разбор OnCalendar таймеров systemd

Введите выражение OnCalendar или вставьте строку cron для преобразования. Вы получите смысл, следующие десять запусков и полную пару .timer + .service, готовую для /etc/systemd/system.

Файлы юнитов

  

Результаты и сообщения этого инструмента выводятся на английском языке.

Синтаксис OnCalendar

Формат — [День недели] Дата Время, каждая часть необязательна: Mon..Fri *-*-* 06:30:00. Дни недели записываются трёхбуквенными именами с диапазонами через .. и запятыми. Дата — YYYY-MM-DD, где * означает «любой»; время — HH:MM:SS (секунды по умолчанию 00). Любое поле принимает списки (1,15), диапазоны (8..18) и шаги (*/15 или 0/15, 8..18/2). Сокращения: minutely, hourly, daily, weekly, monthly, yearly, quarterly. Имя пояса в конце применяет выражение в этом поясе (*-*-* 09:00 Europe/Belgrade).

CronOnCalendar
*/5 * * * **-*-* *:*/5:00
0 * * * *hourly
30 6 * * 1-5Mon..Fri *-*-* 06:30:00
0 9 1 * **-*-01 09:00:00
0 3 * * 0Sun *-*-* 03:00:00
0 0 L * **-*~01 00:00:00 (последний день месяца: ~ считает с конца)

Что умеют таймеры, чего не умеет cron

  • Persistent=true: если машина была выключена, когда таймер должен был сработать, запустить его при следующей загрузке. Cron просто пропускает запуск (для этого существует anacron).
  • RandomizedDelaySec=: распределяет запуски по окну, чтобы парк машин не обращался к серверу в одну и ту же секунду.
  • AccuracySec=: по умолчанию одна минута; задайте 1s, если важно точное время, или больше, чтобы группировать пробуждения и экономить энергию.
  • Журналы попадают в journal (journalctl -u name.service), задание выполняется с изоляцией, зависимостями и ограничениями ресурсов сервиса, а systemctl list-timers показывает следующий и последний запуски.

Проверка выражения

systemd-analyze calendar "Mon..Fri *-*-* 06:30" печатает нормализованную форму и следующее срабатывание — именно это воспроизводит данная страница. После установки таймера: systemctl daemon-reload && systemctl enable --now name.timer, затем systemctl list-timers --all.

Вопросы

Почему мой таймер срабатывает один раз и больше никогда?

Обычно таймер был запущен, но не включён (systemctl enable --now name.timer), или запускаемый им сервис — oneshot без соответствующего юнита таймера. Проверьте systemctl list-timers и journalctl -u name.timer.

Как запустить таймер от имени обычного пользователя?

Поместите юниты в ~/.config/systemd/user/, используйте systemctl --user и выполните loginctl enable-linger $USER, чтобы они срабатывали без активной сессии входа.

Использует ли OnCalendar системный часовой пояс?

Да, если выражение не заканчивается именем пояса, что поддерживается в systemd 243+. Образы контейнеров и облачные образы обычно в UTC; задайте пояс явно, если расписание подразумевает местное время.

Как выразить «каждый будний день в 9 и в 17»?

Mon..Fri *-*-* 09,17:00:00. Списки работают в любом поле.