Синтаксис 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).
| 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 (последний день месяца: ~ считает с конца) |
Что умеют таймеры, чего не умеет 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. Списки работают в любом поле.