一度にアクティブにできるinitシステムは1つだけです。16.04では、systemdです。
多くのパッケージには、複数のinitシステム用のファイルが付属しているため、異なるOS上の複数のinitシステムで管理できます。Ubuntuでは、複数のinitシステム用のスクリプトがインストールされることがありますが、それらはすべて同時に使用されるわけではありません。
新しいinitシステムは、古いinitシステムとの互換性を維持しようとします。特に、systemdはUpstartとSysVの両方のinitスクリプトとの互換性を維持しようとします。
あなたが言及した「init.d」スクリプトの場合、それはUpstartスクリプトではなく「SysV」initスクリプトです。また、「/ etc / rc5.d」などのディレクトリにシンボリックリンクされている場合、「SysV」initスクリプトは起動時にのみ開始されます。Network Managerにはシンボリックリンクがインストールされていないことがわかります。
systemd
古い「SysV」initスクリプトの管理方法を理解するには、systemdが/etc/init.d scirptsをどのように使用するかを参照してください。。
ここで、「service network-manager restart」を使用してNetwork Managerを再起動する理由についての質問に答えます。このservice
コマンドは、UpstartスクリプトとSysV initスクリプトの両方で使用され、前者を優先します。Network Managerには、16.04のUpstartスクリプトもインストールされてい/etc/init/network-manager.conf
ます。
の出力を確認するとsudo strace service network-manager restart
、何が起こっているのかを把握できます。最初に、出力systemctl
が呼び出されていることを示し、コマンドがsystemdにリダイレクトされていることを示します。まず、開いた直後/usr/bin/service
に、ファイルをシェルスクリプトとして読み取り始めることがわかります。
open("/usr/sbin/service", O_RDONLY) = 3
...
read(10, "#!/bin/sh\n\n#####################"..., 8192) = 8192
これがservice
シェルスクリプトであることがわかったので、ソースコードを確認できます。ソースコードでは、それis_systemd
が検出されて設定されています。systemdの場合、コマンドがに書き換えられることがわかりますsystemctl restart network-manager
。
したがって、3つのinitシステムは共存し、ある程度の互換性がありますが、複雑な層があります。今後の出来事の複雑さを最小限に抑えるには、systemdユニットファイルとsystemctl
ツールを使用してサービスを管理するのが最善です。