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