Somente um sistema init pode estar ativo de uma vez. No 16.04, isso é systemd.
Vários pacotes são enviados com arquivos para vários sistemas init, para que possam ser gerenciados com vários sistemas init em diferentes sistemas operacionais. No Ubuntu, às vezes, os scripts para vários sistemas init são instalados, mesmo que nem todos sejam usados ao mesmo tempo.
Os sistemas init mais recentes tentam manter a compatibilidade com os mais antigos. Em particular, o systemd tenta manter a compatibilidade com os scripts init Upstart e SysV.
No caso do script "init.d" que você mencionou, é um script de inicialização "SysV", não um script Upstart. Além disso, os scripts de inicialização "SysV" somente seriam iniciados na inicialização se eles tivessem um link simbólico para um diretório como "/etc/rc5.d". Você verá que o Network Manager não possui um link simbólico instalado lá.
Para entender como systemd
gerencia scripts de inicialização "SysV" antigos, consulte Como o systemd usa os /etc/init.d scirpts? .
Agora, para responder à pergunta sobre por que ele funciona, reinicie o Network Manager com "service network-manager restart". O service
comando é usado com os scripts Upstart e SysV init, preferindo o primeiro. O Network Manager também possui um script Upstart instalado no 16.04 em /etc/init/network-manager.conf
.
Se você revisar a saída de sudo strace service network-manager restart
, poderá ter uma noção do que está acontecendo. Primeiro, a saída mostra que systemctl
está sendo chamado, indicando que o comando está sendo redirecionado para systemd. Primeiro, logo após a abertura /usr/bin/service
, você pode vê-lo começar a ler o arquivo como um script de shell:
open("/usr/sbin/service", O_RDONLY) = 3
...
read(10, "#!/bin/sh\n\n#####################"..., 8192) = 8192
Agora que sabemos que service
é um script de shell, podemos verificar o código fonte dele. No código fonte, achamos que is_systemd
é detectado e definido. Para o caso systemd, você pode ver que o comando foi reescrito systemctl restart network-manager
.
Portanto, enquanto os três sistemas init coexistem e têm alguma compatibilidade, existem camadas de complexidade. Para minimizar a complexidade do que está acontecendo no futuro, é melhor usar os arquivos de unidade do systemd e a systemctl
ferramenta para gerenciar serviços.