Os conflitos do Linux Systemd não parecem usar o ExecStopPost

1

A. serviço

[Unit]
Description = A-service
Conflicts= B.service
After = network.target

[Service]
PermissionsStartOnly = true
PIDFile = /run/AB/ab.pid
User = root
WorkingDirectory = /root/AB_services
ExecStartPre = /bin/mkdir /run/AB
ExecStartPre = /bin/chown -R root:root /run/AB
ExecStart = /usr/bin/python test_A.py --pid /run/AB/ab.pid
ExecReload = /bin/kill -s HUP $MAINPID
ExecStop = /bin/kill -s TERM $MAINPID
ExecStopPost = /bin/rm -rf /run/AB
PrivateTmp = true

[Install]
WantedBy = multi-user.target

B. serviço

[Unit]
Description = B-Service
Conflicts = A.service
After = network.target

[Service]
PermissionsStartOnly = true
PIDFile = /run/AB/ab.pid
User = root
WorkingDirectory = /root/AB_services
ExecStartPre = /bin/mkdir /run/AB
ExecStartPre = /bin/chown -R root:root /run/AB
ExecStart = /usr/bin/python test_B.py --pid /run/AB/ab.pid
ExecReload = /bin/kill -s HUP $MAINPID
ExecStop = /bin/kill -s TERM $MAINPID
ExecStopPost = /bin/rm -rf /run/AB
PrivateTmp = true

[Install]
WantedBy = multi-user.target

Inicialmente iniciei o A.service e ele foi iniciado com sucesso. No entanto, quando inicio B.service , vejo que o A.service está terminando. Mas seu ExecStopPost não parece ser executado porque estou recebendo o seguinte erro:

/bin/mkdir: cannot create directory ‘/run/AB’: File exists

O ExecStopPost realmente não funciona com Conflicts ??

Obrigado.

    
por wonder 20.02.2018 / 12:21

2 respostas

0

Obrigado Patrick por uma resposta tão explicada e por esclarecer algumas das minhas dúvidas.

Agradecemos saber por fazer as provas em meu nome.

Como a resposta de Patrick menciona, por causa da ordem indefinida, pode se comportar mal. B.service não pode executar o mkdir porque o diretório já existe e o A.service ainda não o removeu.

  1. Você pode definir um pedido para ambos. Não importa o que comece primeiro, eles se comportarão da mesma forma que os requisitos atuais.

  2. Ou você pode criar arquivos pid separados para ambos os serviços e, em ExecStopPost , basta remover o arquivo pid em vez do diretório.

Lembre-se de que, se você seguir o segundo método, ExecStartPre não será necessário.

FYI, depois de passar por alguns dos scripts init.d , acho que o melhor lugar para colocar os arquivos pid é /var/run/ sem criar nenhum diretório extra. Isso será válido somente se seus serviços forem iniciados como raiz, pois o local é protegido contra gravação apenas para raiz.

    
por 21.02.2018 / 05:55

Tags