Назад | Перейти на главную страницу

systemd: неработающая необязательная зависимая служба неожиданно запускается при перезапуске родителя

У меня 3 услуги:

  1. ParentService, который предоставляет большую часть моего приложения
  2. DependentServiceA, который сильно зависит от (т.е. фактически бесполезен без) запущенного ParentService. Когда DependentServiceA запущен, его жизненный цикл должен быть привязан к ParentService (перезапускаться вместе, останавливаться вместе).
  3. DependentServiceB, который слабо зависит от ParentService (т.е. большая часть функций привязана к ParentService, но по-прежнему полезна без). ParentService (или DependentServiceA, естественно) не должен влиять на жизненный цикл DependentServiceB. Он должен начинаться после ParentService.

Ожидаемое поведение

Все это отлично работает на:

Эта проблема

Это делает не работа над:

В Debian 8, если я повторнозапустить ParentService, когда DependentServiceA не работает, DependentServiceA все равно запускается. Это не происходит, если только начало ParentService.

Я прикрепил свои файлы systemd ниже для просмотра. Я почти уверен, что это проблема в модульном файле DependentServiceA, но признаю, что не полностью понимаю всех различий между директивами зависимостей systemd (например, BindsTo, PartOf, WantedBy).

ParentService

[Unit]
Description=Parent service
BindsTo=network.target
After=network.target
Before=soss_svc_rest.service dependent_service_b.service

[Service]
Type=forking
ExecStart=/usr/local/foobar/parent_service
KillMode=process
Restart=on-failure
PIDFile=/var/run/parent_service.pid

[Install]
WantedBy=multi-user.target
WantedBy=dependent_service_a.service

DependentServiceA

[Unit]
Description=Dependent Service A
BindsTo=network.target
After=network.target
After=parent_service.service
BindsTo=parent_service.service
PartOf=parent_service.service

[Service]
Type=forking
PIDFile=/var/run/dependent_service_a.pid
ExecStart=/usr/local/foobar/dependent_service_a
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

DependentServiceB

[Unit]
Description=Dependent Service B
BindsTo=network.target
After=network.target
After=parent_service.service

[Service]
Type=forking
PIDFile=/var/run/dependent_service_b.pid
ExecStart=/usr/local/foobar/dependent_service_b
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

Если это актуально, ParentService и DependentServiceB помечены как включен (Я хочу, чтобы они запускались при запуске системы), но для DependentServiceA установлено значение отключен по умолчанию и должен быть явно запущен и / или установлен на включен пользователем для запуска при запуске системы.

Что я неправильно настроил в моих файлах модулей systemd, из-за чего DependentServiceA запускается, когда он ранее не запускался при перезапуске ParentService? И почему это происходит только в Debian 8, но ни в одном из других дистрибутивов, которые я тестировал? Это ошибка в системе Debian 8 (выпуск 215), которая была исправлена ​​между версиями 216 и 219? (Я не видел ничего значимого в истории выпусков systemd.)