Вопрос или проблема
У меня есть 2 одноразовых сервиса для выполнения полного и дифференциального резервного копирования: service_1
и service_2
соответственно. service_1
запускается по таймеру в первый день месяца, service_2
— на 7-й день месяца.
Предположим, что я не включал свой компьютер до 8-го числа месяца, следовательно, оба сервиса захотят запуститься после загрузки системы.
Возможно ли сделать так, чтобы service_1
всегда запускался первым, а затем второй
(важно сначала запустить и дождаться окончания service_1
, и только затем запускать второй
)? В этой ситуации важно сначала запустить service_1
, а затем второй
или не запускать вовсе.
Я пытался использовать After=service_1.service
в service_2
, но это приводит к повторному запуску service_1
, потому что он становится неактивным после выполнения (сервисы одноразовые). Мне не нужно запускать service_1
снова.
Может быть, проблемы и не существует, потому что таймеры запускаются в календарном порядке после загрузки системы, но информации об этом я не нашел.
Думаю, проблема не экзотическая, но мне не удалось найти ответ в интернете.
.
Ответ или решение
Для решения вашей задачи, необходимо более детально разобраться с системами управления и расписанием служб в Linux. Ваша задача по сути сводится к корректному запуску и управлению порядком выполнения двух "oneshot" служб — service_1
(полный бэкап) и service_2
(дифференциальный бэкап). Рассмотрим, как можно реализовать требуемое поведение.
Теория
Службы "oneshot" — это системные службы, которые запускаются, выполняют определённое действие и завершаются. Они идеально подходят для задач, требующих единовременного выполнения, как, например, резервное копирование. У вас есть два таких сервиса, которые запускаются по определённому расписанию с помощью таймеров systemd
.
systemd
— это современная система инициализации в Linux, которая управляет процессами и службами. Она поддерживает таймеры, которые используются для планирования задач. В вашем случае, два таймера планируют запуск резервных копий.
Пример
У вас настроено два таймера:
timer_1
запускаетservice_1
первого числа каждого месяца.timer_2
запускаетservice_2
седьмого числа каждого месяца.
Ситуация заключается в том, что если компьютер не включался до 8-го числа месяца, то оба таймера обнаружат, что они пропустили выполнение, и постараются компенсировать это при включении системы.
Применение
Чтобы решить вашу проблему, требуется настроить выполнение так, чтобы соблюдался порядок: сначала service_1
, потом service_2
. Первоначальная идея с After=service_1.service
в service_2.service
не работает, так как service_1
после своего выполнения возвращается в состояние "inactive".
Шаги для настройки:
-
Создайте "зависимый" сервис.
Создайте новый "wrapper" сервис, который будет управлять выполнением обоих ваших служб.Создайте файл
/etc/systemd/system/backup-wrapper.service
:[Unit] Description=Wrapper service to ensure execution order of backup services Wants=service_1.service service_2.service After=network.target [Service] Type=oneshot ExecStart=/bin/sh -c 'systemctl start service_1.service && systemctl start service_2.service'
Здесь мы указываем, что сначала должен выполниться
service_1
, а затемservice_2
. -
Используйте механизм таймеров "persistent".
Настройте таймеры таким образом, чтобы пропущенные события запускались при включении системы.В файле
/etc/systemd/system/timer_1.timer
и/etc/systemd/system/timer_2.timer
добавьте:[Timer] Persistent=true
Это обеспечит запуск таймеров при включении даже если их время было пропущено.
-
Настройте универсальный таймер.
Чтобы запускать оба ваших сервиса в заданном порядке даже в случае пропусков, создайте новый таймер дляbackup-wrapper.service
.Создайте файл
/etc/systemd/system/backup-wrapper.timer
:[Unit] Description=Run the backup wrapper service at the start of month [Timer] OnCalendar=monthly Persistent=true [Install] WantedBy=timers.target
Теперь система будет контролировать выполнение целевого порядка и в случае пропусков запускать оба сервиса именно в заданной последовательности.
-
Активируйте все таймеры и сервисы:
Выполните команду для активации и запуска:
sudo systemctl enable backup-wrapper.timer sudo systemctl start backup-wrapper.timer
Заключение
Данная конфигурация обеспечивает запуск сервисов service_1
и service_2
в нужном порядке. Таким образом, service_1
будет выполняться первым, и только после его завершения выполнится service_2
. Если компьютер не был включен до момента их планирования, механизм "persistent" таймеров предпримет попытку восстановить последовательность выполнения.
Система systemd
предлагает гибкие настройки таймеров и служб, позволяющие удовлетворить большинство типичных требований по управлению фоновыми процессами. Настройка зависимости выполнения в данном случае решает вопрос порядка и времени выполнения резервного копирования.