Como posso systemd alvos para parar serviços de outros alvos?

3

Gostaria de ter várias segmentações systemd , chamá-las de TargetA , TargetB e TargetC , que controlam um conjunto de serviços. Chame-as de Service01 a Service7 . A configuração seria algo como isto:

  • %código%
    • TargetA
    • Service1
    • Service2
  • Service3 quer
    • TargetB
    • Service3
    • Service4
  • Service5 quer
    • TargetC
    • Service5
    • Service6

Objetivos:

  • Apenas um destino deve ter permissão para ser ativado por vez
  • O administrador do sistema deve ser capaz de iniciar manualmente e de serviços à vontade

Minha configuração inicial envolveu:

  • Cada alvo entrou em conflito com os outros dois alvos
  • Todos os serviços tinham Service7 ativado

Isso atendeu ao primeiro requisito. A partir de StopWhenUnneeded=true , os outros dois alvos foram parados. Infelizmente, essa configuração restringiu o sysadmin. Se o administrador do sistema executasse TargetX , o serviço seria iniciado e morreria imediatamente porque não era necessário.

Minha segunda configuração envolveu:

  • Cada alvo entrou em conflito com os outros dois destinos
  • Cada alvo também entra em conflito com os serviços de que não precisa
  • Nenhum serviço tem sudo systemctl start ServiceX

Por exemplo:

  • %código%
    • quer
      • StopWhenUnneeded=true
      • TargetA
      • Service1
    • Conflitos
      • Service2
      • Service3
      • Service4
      • Service5
      • Service6
      • Service7

Isso não tem o efeito desejado. Se eu correr:

TargetB

seguido por:

TargetC

então sudo systemctl start TargetA.target está parado (yay!), mas sudo systemctl start TargetB.target e TargetA.target ainda estão em execução.

O que eu não estou recebendo? Como posso obter o comportamento Service1 que estou procurando?

    
por Dennis Dragonbain 17.03.2017 / 19:46

1 resposta

3

Abordagem sugerida:

  1. Use systemctl isolate para iniciar cada um dos 3 alvos. Conforme documentado em man systemctl , esse é um comando poderoso: "O comando isolate interromperá imediatamente os processos que não estão habilitados na nova unidade, possivelmente incluindo o ambiente gráfico ou terminal que você está usando atualmente." Estruture suas dependências de destino com cuidado! Possivelmente inclua multi-user.target como dependência.
  2. Certifique-se de que o primeiro serviço que o destino inicia seja um especial que verifique se os outros destinos não estão ativos. Isso é contra um administrador que acidentalmente "inicia" um dos seus destinos personalizados em vez de "isolá-lo". Você usa /bin/systemctl is-active your.target para verificar rapidamente se ele retorna "ativo" ou não.
por 18.03.2017 / 00:48

Tags