web-dev-qa-db-ja.com

upstartまたはsysvinitによってサービスが開始されたかどうかを確認する方法

一部のサービス(例:bluetooth)では、/etc/init.d//etc/init/ディレクトリの両方にエントリがあります。

このサービスの開始方法を知るにはどうすればよいですか? sysvinitまたはupstartによって?

Ubuntu 14.04を使用しています。

2
sps

スクリプトが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コマンドを使用して、不要な互換性レイヤーの関与を回避します。

1
Mark Stosberg