Как поочередно запустить 2 пропущенные одноразовые службы

Вопрос или проблема

У меня есть 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, которая управляет процессами и службами. Она поддерживает таймеры, которые используются для планирования задач. В вашем случае, два таймера планируют запуск резервных копий.

Пример

У вас настроено два таймера:

  1. timer_1 запускает service_1 первого числа каждого месяца.
  2. timer_2 запускает service_2 седьмого числа каждого месяца.

Ситуация заключается в том, что если компьютер не включался до 8-го числа месяца, то оба таймера обнаружат, что они пропустили выполнение, и постараются компенсировать это при включении системы.

Применение

Чтобы решить вашу проблему, требуется настроить выполнение так, чтобы соблюдался порядок: сначала service_1, потом service_2. Первоначальная идея с After=service_1.service в service_2.service не работает, так как service_1 после своего выполнения возвращается в состояние "inactive".

Шаги для настройки:

  1. Создайте "зависимый" сервис.
    Создайте новый "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.

  2. Используйте механизм таймеров "persistent".
    Настройте таймеры таким образом, чтобы пропущенные события запускались при включении системы.

    В файле /etc/systemd/system/timer_1.timer и /etc/systemd/system/timer_2.timer добавьте:

    [Timer]
    Persistent=true

    Это обеспечит запуск таймеров при включении даже если их время было пропущено.

  3. Настройте универсальный таймер.
    Чтобы запускать оба ваших сервиса в заданном порядке даже в случае пропусков, создайте новый таймер для 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

    Теперь система будет контролировать выполнение целевого порядка и в случае пропусков запускать оба сервиса именно в заданной последовательности.

  4. Активируйте все таймеры и сервисы:

    Выполните команду для активации и запуска:

    sudo systemctl enable backup-wrapper.timer
    sudo systemctl start backup-wrapper.timer

Заключение

Данная конфигурация обеспечивает запуск сервисов service_1 и service_2 в нужном порядке. Таким образом, service_1 будет выполняться первым, и только после его завершения выполнится service_2. Если компьютер не был включен до момента их планирования, механизм "persistent" таймеров предпримет попытку восстановить последовательность выполнения.

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

Оцените материал
Добавить комментарий

Капча загружается...