一部のサービス(例:bluetooth)では、/etc/init.d/
と/etc/init/
ディレクトリの両方にエントリがあります。
このサービスの開始方法を知るにはどうすればよいですか? sysvinit
またはupstart
によって?
Ubuntu 14.04を使用しています。
スクリプトが2セットある場合でも、アクティブな初期化システムは1つしかありません。 Ubuntu 14.04では、それがUpstartです。
したがって、スクリプトが/etc/init.d
または/etc/init
の下にあるかどうかに関係なく、initシステムがUbuntu 14.04の下でスクリプトを実行する答えは常にUpstartです。
strace
を使用して/etc/init.d
スクリプトを実行すると、STDOUTへのシステムコールをログに記録して、何が起こるかを確認できます。
Sudo strace /etc/init.d/bluetooth start
最初に、initスクリプトが最初に/lib/lsb/init-functions
を介していくつかのヘッダー関数をロードすることがわかります
open("/lib/lsb/init-functions", O_RDONLY) = 3
すぐに、アクティビティがUpstart関連のスクリプトに転用されることがわかります。
open("/lib/lsb/init-functions.d/01-upstart-lsb", O_RDONLY) = 3
これはシェルスクリプトにすぎないので、それを開いてソースを読み取り、その機能を確認できます。
出力を使い続けると、SysV initスクリプトの代わりにUpstartスクリプトを使用してスクリプトを開始するようにコマンドがリダイレクトされることがわかります。
興味深いのは、16.04の場合、Upstartがさらにコントロールをsystemdにリダイレクトし、代わりに関連するsystemdサービスが開始されることです。
write(1, "Starting bluetooth (via systemct"..., 53Starting bluetooth (via systemctl): bluetooth.service) = 53
SysV init互換性レイヤーの複雑さと潜在的な混乱を避けるために、Ubuntu 14.04でUpstartスクリプトとサービス管理コマンドを使用するという最終的なアドバイス。同様に、16.04にアップグレードしたら、ネイティブのsystemd
unityファイルとsystemctl
コマンドを使用して、不要な互換性レイヤーの関与を回避します。