Я использую несколько шаблонных таймеров для запуска наборов шаблонных служб. Есть задания резервного копирования и связанные с ними задачи обслуживания, которые требуют монопольной блокировки репозитория резервных копий и не могут выполняться одновременно с заданиями резервного копирования. Я пытаюсь понять, как настроить блоки, чтобы задания выполнялись правильно.
Например, у меня есть следующие шаблоны услуг:
backup@.service
clean@.service
У меня есть следующие шаблоны таймеров:
backup-daily@.timer
backup-weekly@.timer
clean-daily@.timer
clean-weekly@.timer
Где backup-daily@.timer
единица запускает соответствующий backup@.service
экземпляр и может выглядеть примерно так:
[Unit]
Description=daily backup of %i
[Timer]
OnCalendar=daily
Unit=backup@%i.service
[Install]
WantedBy=timers.target
Если я сбегу ...
systemctl enable --now backup-daily@foo.timer clean-daily@foo.timer
... Мне нужно убедиться, что служба clean @ foo не запускается до завершения службы резервного копирования @ foo.
Единственное решение, которое я придумал, - это отказаться от OnCalendar=daily
и вместо этого используйте явное время начала, чтобы я мог гарантировать задания резервного копирования Начало сначала (например, запускать задания резервного копирования в 01:00, а работы по обслуживанию в 2:00), а затем использовать какую-то блокировку (например, flock
), чтобы гарантировать, что задания обслуживания не начнутся, пока не будут завершены задания резервного копирования.
Это работает, но немного взломано. Если есть лучший способ решить эту проблему с помощью systemd, я хотел бы это выяснить.
Подумав немного над этим вопросом, можно получить очевидный ответ: в clean@.service
шаблон, добавьте зависимость от соответствующего backup@.service
например, вот так:
[Unit]
After=backup@%i.service
Это нормально работает, пока службы запускаются параллельно. Я не знаю прямо сейчас, если услуги с такими же OnCalendar
установка запускаются параллельно - нет; Я обновлю этот ответ, как только разберусь с ним.