Eu tenho um monte de serviços (digamos, S1, S2,... S10
) que só devem começar depois que um serviço crítico C1 for inicializado. C1 grava um arquivo (digamos para /var/run/critical.init
) indicando que concluiu sua inicialização. Neste ponto, cada um dos serviços S1..S10
deve ser iniciado pelo systemd.
Ao tentar implementar o acima, usei a ativação baseada em .path
do systemd e criei dois arquivos: um para o arquivo .path de S1
:
$ cat s1.path
[Path]
PathExists=/var/run/critical.init
Unit=s1.service
[Install]
WantedBy=multi-user.target
$ systemctl enable s1.path
e um arquivo que descreve o serviço em si:
$ cat s1.service
[Unit]
Description=Some service
After=syslog.target
[Service]
ExecStart=/usr/bin/s1
Type=simple
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Após a reinicialização, verifiquei que systemctl status s1
mostra que a unidade está ativa e S1
está não listado na saída de ps -ef
(conforme esperado). Logo após criar o arquivo /var/run/critical.init
manualmente, o systemd inicia a unidade s1
.
O experimento acima confirmou que a ativação baseada em caminho funciona para uma unidade. Eu gostaria de estender isso para todos os serviços S1...S10
.
A maneira óbvia é escrever um arquivo .path
para cada serviço, mas estou procurando uma solução mais elegante.
Este problema pode ser resolvido usando um systemd target
? Se cada um dos serviços S1...S10
fizer parte de um novo critical.target
em vez de multi-user.target
, posso definir a dependência de /var/log/critical.init
estar presente antes que qualquer uma das unidades em critical.target
seja acionada? Quaisquer outras sugestões são bem-vindas também.
Tags systemd