Por que o systemd não está derrubando dependências?

1

Eu criei um arquivo de serviço systemd, cuja tarefa não é nada, mas apenas para abrir outros serviços e abri-los também.

Como ele não faz nada, além de criar outros serviços, coloquei um eco em ExecStart e ExecStop .

O problema é que eu posso ver que as dependências são atualizadas quando invoco service <myService> start , mas elas não são interrompidas quando eu chamo service <myService> stop . Mesmo usando BindsTo não funciona.

Aqui está o meu arquivo de configuração de serviço:

[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

Solução: Como sugerido por @grawity i, criei um arquivo .target chamado index-start.target, conforme abaixo:

[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

E um arquivo de serviço chamado 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

E quando invocado, service index start inicia as dependências e service index stop para as dependências.

    
por kingsmasher1 12.01.2016 / 11:03

2 respostas

2

Primeiro, você deve usar um .target aqui, não um manequim serviço. (E para serviços simulados, Type=oneshot e ExecStart=/bin/true seriam mais adequados do que forking .)

BindsTo= (e PartOf= ) precisa ser usado na direção oposta - funciona como Requires= em que a unidade this é parada se o As unidades listadas desaparecem. Então você precisa adicioná-lo ao mysql.service e ao ifmFuseHandler.service. (Use drop-ins para estender o mysql.service padrão).

    
por 12.01.2016 / 12:12
2

Graças à sua pergunta / solução, tenho uma boa solução para mim que gostaria de compartilhar.
Meu requisito é ter um allservices.target que inicie / pare / reinicie srv1.service , srv2.service e srv3.service .

Um requisito é que eu possa parar, e. srv1.service e os outros serviços e o alvo ainda estão sendo executados depois disso.

A chave é ter os serviços na diretiva Wants nos serviços .target e 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

Assim depois que eu bato systemctl start allservices.target srv1-srv3 são iniciados, o mesmo acontece com stop e restart .
E se eu executar systemctl stop srv1.service os outros serviços e o destino ainda estiverem em execução.

    
por 13.09.2017 / 19:47

Tags