systemd: установка зависимостей между шаблонными таймерами?

systemd: установка зависимостей между шаблонными таймерами?

Я использую несколько шаблонных таймерных блоков для запуска наборов шаблонных служб. Существуют задания резервного копирования и связанные с ними задачи обслуживания, которые требуют исключительной блокировки на репозитории резервного копирования и не могут выполняться одновременно с заданиями резервного копирования. Я пытаюсь выяснить, как настроить блоки так, чтобы задания были упорядочены правильно.

Например, у меня есть следующие шаблоны услуг:

У меня есть следующие шаблоны таймеров:

Где [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.

Я также рассматривал возможность создания единой задачи резервного копирования и очистки, которая также работала бы аналогичным образом.

Недостатком является то, что я не могу запустить чистую задачу, не начав резервное копирование, хотя это и не является реальной проблемой.

Связанный контент