私のシステム(16.04)には、たとえば、ファイル/lib/systemd/system/network-manager.service
および/etc/init.d/network-manager
があります。
これがどのように(そしてなぜ)機能するのか理解できません。 Network Managerは常にSudo service network-manager restart
で再起動します。これはどういうわけかsystemdを台無しにすべきではありませんか?まだ機能しているようです。
service --status-all
がすべての種類のサービスをリストするのはなぜですか? 16.04はUpstartの代わりにsystemdを使用すべきではありませんか?
誰かがこの共存の仕組みを説明してください。
一度にアクティブにできるinitシステムは1つだけです。 16.04では、systemdです。
多くのパッケージには、複数のinitシステム用のファイルが付属しているため、異なるOS上の複数のinitシステムで管理できます。 Ubuntuでは、複数のinitシステム用のスクリプトがインストールされることがありますが、それらはすべて同時に使用されるわけではありません。
新しいinitシステムは、古いシステムとの互換性を維持しようとします。特に、systemdは、UpstartおよびSysV initスクリプトの両方との互換性を維持しようとします。
あなたが言及した「init.d」スクリプトの場合、それはUpstartスクリプトではなく「SysV」initスクリプトです。また、「SysV」initスクリプトは、「/ etc/rc5.d」などのディレクトリにシンボリックリンクされている場合にのみ、起動時に開始されます。 Network Managerにはシンボリックリンクがインストールされていないことがわかります。
systemd
が古い「SysV」initスクリプトをどのように管理するかを理解するには、 systemdが/etc/init.d scirptsをどのように使用するか を参照してください。
次に、「service network-manager restart」でNetwork Managerを再起動する理由についての質問に答えます。 service
コマンドは、UpstartスクリプトとSysV initスクリプトの両方で使用され、前者を優先します。 Network Managerには、16.04の/etc/init/network-manager.conf
にインストールされたUpstartスクリプトもあります。
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つの初期化システムは共存し、ある程度の互換性がありますが、複雑な層があります。今後の出来事の複雑さを最小限に抑えるには、systemdユニットファイルとsystemctl
ツールを使用してサービスを管理するのが最善です。