Eu tenho um fw.service
arquivo de unidade systemd que é um requisito para networking.service
:
# systemctl show networking -p Requires
Requires=system.slice fw.service
#
Quando o networking.service
está no active
estado e eu executo systemctl stop fw
e alguns segundos depois systemctl start fw
, ele networking.service
fica no inactive (dead)
estado. No entanto, quando o networking.service
está no active
estado e eu executo systemctl restart fw
, o networking.service
também é reiniciado.
Esse é um comportamento esperado? Eu pensei que systemctl restart
é basicamente systemctl stop
seguido por systemctl start
e, portanto systemctl start
, também deve iniciar o networking.service
.
restart
é semelhante astop
+start
, mas não é idêntico.restart
as tarefas são tratadas de forma diferente dentro dosystemd
gerenciador de serviços. Não é um simples recurso de conveniência nasystemctl
interface.[*]Olhando para esse comportamento específico, ele não está documentado explicitamente na versão atual do
man systemd.unit
. (Pelo menos na minha instalação dosystemd-239
).O comportamento com
stop
é documentado. E o comportamento comstart
também é consistente com a documentação. O que não está explicitamente documentado é a propagação dorestart
para a unidade que exigiufw.service
. No entanto, vejo uma dica sobre isso em outro tipo de dependência:A dica é que se
PartOf=
for um subconjunto limitado deRequires=
, entãoRequires=
fará tudo o quePartOf=
fizer. Portanto, isso inclui a propagação de reinicializações.Se
networking.service
realmente não quisesse ser interrompido na primeira etapa, você poderia substituirRequires=fw.service
porWants=fw.service
. Mas suponho queRequires=
foi usado deliberadamente, para tentar garantir que você nunca ative sua rede sem que suas regras de firewall estejam ativas.Você pode esperar que as reinicializações sejam sequenciadas de forma que
networking.service
nunca seja ativada semfw.service
também estar ativa, supondo que também seja definidaAfter=fw.service
... Não confirmei que isso é o que realmente acontece. (Se esta é sua esperança, eu recomendaria verificá-la com base em alguma autoridade diferente desta resposta :-).Se você realmente quiser, eu acho que você pode colocar
Wants=networking.service
emfw.service
, mesmo quenetworking.service
tenhaRequires=fw.service
. Isso é possível porque essas dependências não implicam em uma ordem específica. Acho que você só pode ter problemas com "loops de dependência" se tiver um conflito em suas dependências de ordenação - as configuraçõesAfter=
e .Before=
[*] Por exemplo
systemd-logind
, destina -se a ser reinicializável e é organizadosystemd
para manter certos arquivos críticos abertos durante a reinicialização. Mas se você apenasstop
logar, os arquivos abertos serão perdidos. (AFAIK reiniciar o systemd-logind ainda quebra todas as versões atuais do Xorg ou Wayland, mas você pode ver a ideia de que osystemd
código está tratandorestart
de maneira diferente :-P).