encerra o sistema quando várias unidades systemd param

4

Estou tentando desligar o computador quando uma lista específica de unidades do systemd parar.

O pano de fundo é que tenho um farm de computação no Google Cloud & AWS EC2, e cada instância lança alguns serviços que executam um monte de trabalho e, em seguida, terminam quando concluídos. Como essas são instâncias de nuvem e custam dinheiro, a instância deve ser encerrada quando não estiver mais fazendo nada.

A maioria das sugestões que vi em torno disso envolvem colocar um ExecStopPost=/sbin/init 0 (ou similar) no arquivo de unidade do systemd. No entanto, não consigo encerrar a instância até que todas as unidades tenham sido concluídas. É fácil criar uma unidade target que agrupe as unidades de trabalho individuais e, em seguida, coloque um StopWhenUnneeded=true para que o destino pare quando todos os trabalhadores forem parados. Mas eu não vejo uma maneira de usar isso para acionar o sistema para desligar (por exemplo, invocando systemd-halt.service ).

Portanto, a pergunta é: como posso fazer com que o sistema seja desligado quando uma lista de unidades ou minha unidade de destino for interrompida.

    
por Patrick 30.10.2017 / 02:29

1 resposta

2

Após algumas experiências, uma solução funcional, não totalmente feia, é usar a ideia do invólucro target unit, mas use um service , que desliga o sistema na saída.

Por exemplo, o serviço do trabalhador:

# [email protected]
[Unit]
BindsTo=master.service
After=master.service

[Service]
ExecStart=/bin/myworker

[Install]
WantedBy=master.service

E depois para o wrapper:

# master.service
[Unit]
StopWhenUnneeded=true

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/sbin/init 0

Eu posso fazer systemctl start master.service para iniciar todos os trabalhadores (depois de systemctl enable ing), e quando todos eles saírem, master.service irá parar e executar init 0 .
systemctl stop master.service também sinalizará as unidades de trabalho para parar, mas esperará por elas antes de executar o init 0 .

A fealdade é ter que criar um serviço falso que executa /bin/true . Seria melhor se houvesse uma unidade systemd existente que, quando parada, resultaria no desligamento do sistema, mas isso é pelo menos funcional.

    
por 30.10.2017 / 05:30

Tags