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.