Как сказать systemd запустить службу после корректного завершения другой службы

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

Я пытаюсь запустить службу systemd после того, как закончится другая служба (например: в приложении это может быть exit(EXIT_SUCCESS)).

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

Возможно ли сделать это правильно?

[Unit]
Description=Служба 1

[Service]
Type=simple
ExecStart=/path/to/your/service1/command
ExecStopPost=/bin/systemctl start service2.service  # Запустить service2 после остановки service1

[Install]
WantedBy=multi-user.target

Или вы можете создать отдельную службу, чтобы обрабатывать это все вместе (что похоже на то, что вы хотите активировать с помощью вашего взаимодействия с пользователем, вместо systemctl stop service1.

[Unit]
Description=Остановить service1 и запустить service2, если успешно
After=service1.service
Wants=service1.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash -c 'если systemctl stop service1.service; тогда systemctl start service2.service; fi'

[Install]
WantedBy=multi-user.target

.

Ответ или решение

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

Решение через ExecStopPost

Первое решение заключается в использовании параметра ExecStopPost. Он позволяет выполнять команды после завершения основного процесса службы. Обратите внимание, что это решение сработает только в случае, если служба завершится без ошибок. Вот пример конфигурации юнита:

[Unit]
Description=Служба 1

[Service]
Type=simple
ExecStart=/path/to/your/service1/command
ExecStopPost=/bin/systemctl start service2.service  # Запускаем service2 после остановки service1

[Install]
WantedBy=multi-user.target

В этом примере, когда service1 успешно завершает свою работу, systemd автоматически запускает service2.

Создание отдельной службы для управления переходом

Второе решение предлагает более гибкий подход, создавая отдельную службу, которая будет управлять запуском и остановкой необходимых компонентов. Эта служба будет ожидать завершения первой службы, а затем в зависимости от её статуса (успешного или нет) будет запускать вторую. Пример конфигурации может выглядеть следующим образом:

[Unit]
Description=Остановка service1 и запуск service2 при успешном завершении
After=service1.service
Wants=service1.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash -c 'if systemctl stop service1.service; then systemctl start service2.service; fi'

[Install]
WantedBy=multi-user.target

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

Заключение

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

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

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

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