Ordenação no systemd
É comum precisarmos ordenar unidades, sejam do tipo service, target, etc. O systemd oferece dois tipos de configuração para o propósito: ordenação (
Não tão claro é o papel de
Suponhamos
Entram as dependências de requerimento. Novo
Agora, com
As dependências reversas implícitas existem igualmente para
Têm efeito igual a
Outra opção útil é
Relacionado:
Modificar parâmetros dos arquivos de unidade do systemd
Básico dos arquivos de unidade do systemd
Olho de Cylon do systemd
systemctl cat/edit
systemctl enable|disable|mask --now
systemctl revert
After=
, Before=
) e requerimento (Wants=
, Requires=
). As duas classes de dependências são independentes. Nota: existem outras opções menos usadas, porém não comentarei sobre elas aqui.After=
e Before=
dizem respeito à ordem, como esperado. São dependências de mão dupla: se você especificar After=yyy.service
no serviço xxx.service
, está implícita naquele uma dependência reversa Before=xxx.service
.xxx.service yyy.service +--------------------+ +--------------------+ | | Implícito | | | After=yyy.service | ------------> | Before=xxx.service | | | | | +--------------------+ +--------------------+
Não tão claro é o papel de
Wants=
e Requires=
.Suponhamos
bbb.service
com estas opções:[Unit] Description=Serviço BBB After=aaa.service [Service] ...
After=aaa.service
diz que bbb.service
será iniciado depois que aaa.service
tenha completado sua inicialização. Não é o suficiente? Talvez não, pois existe um detalhe: e se aaa.service
estiver parado (esteja habilitado ou não)? bbb.service
iniciará sem aaa.service
! Lembremos que desabilitado/habilitado e iniciado/parado são coisas totalmente independentes.Entram as dependências de requerimento. Novo
bbb.service
:[Unit] Description=Serviço BBB Wants=aaa.service After=aaa.service [Service] ...
Agora, com
Wants=
e After=
, você diz ao systemd para iniciar bbb.service
depois de aaa.service
e, se aaa.service
estiver parado, que inicie-o primeiro para só depois bbb.service
iniciar. Aí está a diferença.Wants=
e Requires=
são configurações parecidas. Wants=
permite falha na dependência, enquanto Requires=
não. Trocando Wants=aaa.service
por Requires=aaa.service
no serviço acima, caso aaa.service
falhe por algum motivo, bbb.service
não iniciará. Em outras palavras: Requires=
é uma exigência e Wants=
é um desejo.As dependências reversas implícitas existem igualmente para
Wants=
e Requires=
(WantedBy=
e RequiredBy=
). É pertinente esclarecer que WantedBy=
e RequiredBy=
, ao contrário da relação existente entre After=
e Before=
, apenas podem ser adicionadas através de links como explicado no parágrafo abaixo. Não é possível colocá-las na seção [Unit]
.bbb.service aaa.service +----------------------+ +------------------------+ | | Implícito | | | Wants=aaa.service | ----------> | WantedBy=bbb.service | | | | | +----------------------+ +------------------------+ bbb.service aaa.service +----------------------+ +------------------------+ | | Implícito | | | Requires=aaa.service | ----------> | RequiredBy=bbb.service | | | | | +----------------------+ +------------------------+
WantedBy=<nome>.<tipo>
e RequiredBy=<nome>.<tipo>
são também opções da seção [Install]
, que criam, quando systemctl enable
ou systemctl preset
habilitam uma unidade, link simbólico apontando para a mesma nos diretórios /etc/systemd/system/<nome>.<tipo>.wants
ou /etc/systemd/system/<nome>.<tipo>.requires
(serão criados caso necessário).Têm efeito igual a
Wants=
e Requires=
diretamente nos arquivos. As distribuições podem fornecer unidades pré-habilitadas em seus pacotes, criando links em /usr/lib/systemd/system/<nome>.<tipo>.wants
e /usr/lib/systemd/system/<nome>.<tipo>.requires
. Geralmente esse tipo de configuração é usada para lidar com unidades do tipo target e fica automatizada com systemctl enable|disable|preset
. No papel de administrador, você lidará quase sempre com Wants=
e Requires=
.Outra opção útil é
PartOf=
. De novo, é independente das demais e serve para criar uma dependência exclusiva de reinicialização e parada. Voltemos ao nosso serviço hipotético bbb.service
:[Unit] Description=Serviço BBB Wants=aaa.service After=aaa.service PartOf=aaa.service [Service] ...
PartOf=aaa.service
faz com que, ao aaa.service
ser parado ou reiniciado, bbb.service
também o seja. PartOf=
é uma dependência de mão única. Se bbb.service
reiniciar ou parar, aaa.service
não será afetado. Caso queira o mesmo comportamento nos dois sentidos, faz-se necessário editar aaa.service
e adicionar lá PartOf=bbb.service
.Relacionado:
Modificar parâmetros dos arquivos de unidade do systemd
Básico dos arquivos de unidade do systemd
Olho de Cylon do systemd
systemctl cat/edit
systemctl enable|disable|mask --now
systemctl revert
Comentários
Postar um comentário