Há uma diferença entre Before
/ After
e Wants
/ Requires
/ Requisite
: o primeiro grupo indica que o tempo da unidade começa e o último grupo indica o dependências . Muitas vezes, há pouca diferença entre os dois, mas às vezes é importante. Ler a documentação é útil para mais detalhes, já que deixei de fora o material que você não vejo com tanta frequência.
Como exemplo, vamos fingir que você tem alguns serviços com dependências:
a.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'sleep 5;/bin/false'
RemainAfterExit=yes
b.service
[Unit]
After=a.service
[Service]
Type=oneshot
ExecStart=/bin/echo B
RemainAfterExit=yes
c.service
[Unit]
Requires=a.service
[Service]
Type=oneshot
ExecStart=/bin/echo C
RemainAfterExit=yes
d.service
[Unit]
After=a.service
Requires=a.service
[Service]
Type=oneshot
ExecStart=/bin/echo D
RemainAfterExit=yes
O que é carregado (e em qual ordem) muda drasticamente dependendo do que você começa:
-
a
:a
-
b
:b
-
c
(oua
+c
):a
ec
ao mesmo tempo (c
fica em execução mesmo sea
falhar) -
d
(oua
+d
):a
- >c
(sea
foi iniciado com êxito) -
a
+b
:a
- >b
(independentemente de sea
iniciou)
Por que toda essa complexidade? É para acelerar o carregamento da unidade. Se os serviços não tiverem Before
ou After
referindo-se um ao outro, eles poderão ser iniciados ao mesmo tempo (supondo que nenhuma outra unidade precise deles!)
Onde estão os arquivos .target
? Eles colocam unidades em grupos funcionais, de modo que, à medida que o sistema é iniciado (ou parado, etc.), as unidades necessárias para essa fase podem ser iniciadas juntas e as unidades podem indicar que querem esperar que outra fase seja iniciada. . Por exemplo, uma unidade pode incluir After=network.target
para garantir que a rede tenha a chance de inicializar antes de iniciar, mesmo que esteja instalada como parte de multi-user.target
.
Se quiser ver a ordem em que as unidades dependem umas das outras, você pode executar systemctl list-dependencies
(isso não lhe dirá a ordem que eles carregaram, pois isso é um pouco aleatório fora de Before
/ After
configurações.)