Estou criando um pacote foo
que inicia/fecha o pacote upstream bar
. A relação deve ser:
- Quando você inicia o foo, inicie também o bar.
- Quando você parar/recarregar foo, também pare/recarregue a barra.
bar
pode ser iniciado, interrompido ou recarregado sem afetarfoo
Se /lib/systemd/system/bar.service
parece com isso:
[Unit]
Description=Bar
[Service]
ExecStart=/bin/sleep infinity
Restart=on-failure
Então, a solução "normal" seria adicionar WantedBy
e PartOf
relacionamentos a bar
:
[Unit]
Description=Bar
PartOf=foo.service
[Service]
ExecStart=/bin/sleep infinity
Restart=on-failure
[Install]
WantedBy=foo.service
No entanto, bar
é um pacote upstream e acho que não é certo forçar bar
a estar ciente foo
ou corrigir bar
.
Eu pensei que uma solução perfeita seria criar foo.service
assim:
[Unit]
Description=Foo
Wants=bar.service
ConsistsOf=bar.service
[Service]
Type=oneshot
ExecStart=/bin/true
RemainAfterExit=yes
No entanto, meu journalctl diz:
Valor l desconhecido 'ConsistsOf' na seção 'Unidade'
e as páginas man dizem:
Quando PartOf=b.service é usado em a.service, essa dependência será mostrada como ConsistsOf=a.service na listagem de propriedades de b.service. A dependência ConsistsOf= não pode ser especificada diretamente.
Não sei por ConsistsOf=
que não pode ser especificado diretamente, mas existe uma alternativa que não considerei?
A maneira apropriada de modificar o bar.service upstream/externo para incluir um
PartOf=
relacionamento com outra unidade é usar uma configuração de substituição "drop-in", que é um recurso do systemd que permite modificar unidades existentes sem precisar tocar nos arquivos originais.Da página man systemd.unit :
No seu caso particular, você deve criar um drop-in como
/etc/systemd/system/bar.service.d/partof-foo.conf
, com conteúdo:(O nome
partof-foo.conf
é apenas uma sugestão, qualquer coisa com um.conf
sufixo deve funcionar.)Em seguida, recarregue o daemon com
systemctl daemon-reload
.Depois disso, você pode inspecionar a unidade com
systemctl cat bar
, que mostrará claramente que a substituição está sendo levada em consideração. Além disso, agora,systemctl show foo
mostrará umConsistsOf=
relacionamentobar.service
e os efeitos desse relacionamento seguirão (pararfoo
fará combar
que pare.)Para a segunda parte (
foo
tendoWants=bar.service
), sugiro adicionar essa diretiva diretamente emfoo.service
vez de usar uma[Install]
estrofe em um "drop-in" parabar.service
.Por um lado, a
[Install]
seção teria que ser ativada com umsystemctl enable bar
comando, então de certa forma é mais difícil de manter. (Além disso, vi bugs em que[Install]
um "drop-in" não é respeitado. Acredito que eles foram corrigidos, mas ainda podem existir na versão do systemd da sua distribuição.)Além disso, você pode querer usar um
Requires=
relacionamento mais forte, em vez deWants=
, pois issofoo.service
falhará sebar.service
não puder ser iniciado. (Considere também adicionar uma dependência de ordenação, comoAfter=bar.service
fromfoo.service
, parafoo
que na verdade espere até quebar
esteja ativo antes de fazer sua própria inicialização.)Como
foo.service
é um arquivo que você controla, basta incluí-lo diretamente:Isso supondo que você também queira a dependência de ordenação, é seguro omiti-la se não quiser.
Isso deve cuidar de tudo.