1

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

Поскольку он ничего не делает, кроме вызова других сервисов, я добавил эхо к ExecStart и ExecStop .

Проблема в том, что я вижу, что зависимости service <myService> start , когда я вызываю службу <myService> , но они не останавливаются, когда я вызываю service <myService> stop . Даже использование BindsTo не работает.

Вот мой файл конфигурации сервиса:

[Unit]
Description=Starts the DCCA index software
Requires=mysql.service ifmFuseHandler.service
After=mysql.service ifmFuseHandler.service
BindsTo=mysql.service ifmFuseHandler.service

[Install]
WantedBy=multi-user.target

[Service]
ExecStart=/bin/sh -c "echo 'Index started'"
ExecStop=/bin/sh -c "echo 'Index stopped'"

# Execute pre and post scripts as root
PermissionsStartOnly=true
Restart=on-failure

TimeoutSec=600
Type=forking
RemainAfterExit=yes

Решение: По предложению @grawity я создал файл .target с именем index-start.target, как показано ниже:

[Unit]
Description=Starts the DCCA index software
Requires=mysql.service ifmFuseHandler.service
After=mysql.service ifmFuseHandler.service
BindsTo=mysql.service ifmFuseHandler.service

[Install]
WantedBy=multi-user.target

И служебный файл с именем index.service:

[Unit]
Description=Starts the DCCA index software
Requires=index-start.target
After=index-start.target

[Install]
WantedBy=multi-user.target index-start.target

[Service]
ExecStart=/bin/true
ExecStop=/bin/sh -c "echo 'Index stopped'"

# Execute pre and post scripts as root
PermissionsStartOnly=true
#Restart=on-failure (Commented as does not work with type=oneshot)

TimeoutSec=600
Type=oneshot
RemainAfterExit=yes

И когда вызывается, service index start он запускает зависимости, а service index stop он останавливает зависимости.

2 ответа2

2

Благодаря вашему вопросу / решению я получил хорошее решение для меня, которым я хотел бы поделиться.
Мое требование - иметь allservices.target который запускает / останавливает / перезапускает srv1.service , srv2.service и srv3.service .

Требование состоит в том, чтобы я мог остановить, например, srv1.service и другие службы, и цель все еще работает после этого.

Ключ должен иметь службы в директиве Wants в .target и в srv * .services PartOf=allservices.target

allservices.target

[Unit]
Description=start allservices
Wants=syslog.target network.target srv1.service srv2.service srv3.service 
After=network.target
[Install]
WantedBy=multi-user.target

srv1.service

[Unit]
Description=run srv1.service
Wants=syslog.target network.target
PartOf=allservices.target

[Service]
ExecStart=/path/to/bin/start
ExecStop=/bin/kill $MAINPID
Restart=always

[Install]
WantedBy=allservices.target

Таким образом, после того, как я systemctl start allservices.target srv1-srv3, то же самое с stop и restart .
И если я запускаю systemctl stop srv1.service другие службы и цель все еще работают.

2

Во-первых, вам действительно следует использовать здесь .target , а не фиктивный сервис. (А для фиктивных сервисов Type=oneshot и ExecStart=/bin/true были бы более подходящими, чем forking .)

BindsTo=PartOf=) необходимо использовать в противоположном направлении - он работает так же, как Requires= в том, что этот юнит останавливается, если перечисленные юниты исчезают. Поэтому вам нужно добавить его в mysql.service и ifmFuseHandler.service. (Используйте раскрывающиеся модули, чтобы расширить mysql.service по умолчанию.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .