init プロセスには常に PID 1 が割り当てられます。 filesystem は、PID を指定して実行可能ファイルへのパスを取得する方法を提供します。
つまり:
[email protected]:~$ sudo stat /proc/1/exe
File: '/proc/1/exe' -> '/sbin/upstart'
ご覧のとおり、私の Ubuntu 14.10 ボックスの init プロセスは Upstart です。 Ubuntu 15.04 は systemd を使用するため、代わりにそのコマンドを実行すると次の結果が得られます:
[email protected]:~$ sudo stat /proc/1/exe
File: '/proc/1/exe' -> '/lib/systemd/systemd'
あなたが使用しているシステムが 11
を与える場合 その結果、そのファイルを stat してみることをお勧めします:
[email protected]:~$ sudo stat /proc/1/exe
File: '/proc/1/exe' -> '/sbin/init'
[email protected]:~$ stat /sbin/init
File: ‘/sbin/init’ -> ‘/lib/systemd/systemd’
実行して詳細を確認することもできます:
[[email protected] ~]$ /sbin/init --version
init (upstart 0.6.5)
Copyright (C) 2010 Canonical Ltd.
システムを調べてインジケーターを見つけることができます。 1 つの方法は、3 つのディレクトリの存在を確認することです:
-
28
systemd ベースのシステムを使用していることがわかります。 -
38
Upstart ベースのシステムを使用していることを示す良い指標です。 -
45
ボックスの履歴に SysV init があることを示します
問題は、これらはヒューリスティックであり、特定の指標だけではなく、おそらく他のデータと一緒に検討する必要があるということです。私が今見ているUbuntu 14.10ボックスには、3つのディレクトリすべてがあります。なんで? Ubuntu はそのバージョンで Upstart から systemd に切り替えたばかりですが、下位互換性のために Upstart と SysV init を保持しているためです。
結局のところ、ベストアンサーは「経験」だと思います。 CentOS 7 ボックスにログインしたことがわかり、それが systemd であることがわかります。これをどのように学びますか?遊んで、RTFMing など。すべての経験を積むのと同じ方法です。
これはあまり満足のいく答えではないことは承知していますが、それは市場に断片化があり、標準外の設計が作成されたときに起こることです. 53
かどうかをどうやって知るかを尋ねるようなものです 68
を受け入れます 、または 72
、またはカラー出力をまったく行いません。繰り返しますが、答えは「経験」です。
これは実際にはかなり難しい問題です。主な困難の 1 つは、これを最も頻繁に実行したい場所が、インストールまたは変更の途中である可能性が非常に高い場所であるということです。もう 1 つは、インストールされているシステム管理ツールセットの間に微妙ではあるが非常に重要な違いがあることです。 、現在実行中のシステム管理ツールセット 、および次回の起動時に実行されるシステム管理ツールセット .
もちろん、インストールされているものを決定するには、パッケージマネージャーを使用します。しかし、これは、複数のシステムを並べてインストールできるという事実によって複雑になります。
たとえば、Debian Linux では、systemd パッケージをインストールできますが、別の systemd-sysv パッケージをインストールすると、システムがアクティブになります。 systemd と sysvinit パッケージを同時にインストールできるようにすることを目的としています。実際、Debian Linux クラウドは Debian 8 で、すべてのプログラムが異なる名前 (85
、 97
、 104
、 117
、 125
など) まさにこの理由から、「非アクティブ化」パッケージは名前 135
で競合しません。 . 140
次に、「アクティブ化パッケージ」によって次回の起動時に実行するように構成されたものへのシンボリック リンクです。
現在実行されているものと次に実行する準備ができているものを判断するには、一連のツールセット固有のテスト、誤検知によるさまざまな程度のリスク、およびさまざまな程度のドキュメントを使用する必要があります。システム マネージャが現在実行しているものを確認するには、具体的には、プロセス リストまたはシステム マネージャが公開しているさまざまな API を実際に確認する必要があります。しかし、これには落とし穴がまったくないわけではありません。
一般的な初心者
絶対にしないことから始めましょう
158
同じ168
を指します upstart または System 5176
の場合 実行中です。また、一部のシステムでは、180
でもあります。 systemd が実行されているとき。前述のように、Debian Linux の群集は、すべてのプログラムに異なる名前を付けたいと考えていました。しかし、これは Debian 固有のもので、遠い ユニバーサルから、プログラムが
199
として呼び出された場合、実際には役に立ちません (ブートストラップの initramfs フェーズによって)とにかく。 Felix von Leitner の minit のみが実際に Debian 8 によってパッケージ化され、独自の名前で呼び出されます。- 制御 API ファイル
204
の存在 System 5218
に固有のものではありません . systemd には (非プロセス #1)223
があります これを提供するサーバー。 Joachim Nilsson の234
それも提供します。 (さらに楽しくするために、Debian では243
に配置されています .詳細については、https://superuser.com/a/888936/38062 を参照してください。) - systemd、upstart、System 5
255
、および OpenRC はすべて266
を処理します 、前者の 2 つの場合の後方互換性のため。その存在は、特定のシステムの存在を示すものではありません。
検出システム 5 279
皮肉なことに、https://unix.stackexchange.com/a/196197/5132 で説明されているように、少なくとも Debian Linux では一方向です。 System 5 283
の不在を検出するため 293
がないことです .ただし:
- これは、
305
のようなものをパッケージ化する Debian の方法の副作用です。 . - 全体的な問題の一部は、
317
です。 System 5326
の場合は固執します 過去の任意の時点で使用されました 、パッケージをアンインストールしてもその構成ファイルは削除されないためです。 (Debian 7 には331
にエントリを追加してインストールするパッケージがいくつかあるため、これは Debian 8 の作業にとって大きな問題でした。 .) - これは反転テストです。
systemd の検出
「公式」の方法で実行中のシステム マネージャーとして systemd を確認するには、344
の存在を確認します。 .これは 358
のディレクトリです 、systemd 自体がブート時に作成し、他のシステム マネージャーが作成する可能性は低いです。
しかし、それは単にありそうにない .このチェックはすでに壊れています これは、uselessd もこのディレクトリを作成するためです。
その他の非公式のチェックは機能しません:
- systemd は D-Bus 経由で RPC API 全体を発行します。これにはバージョン名と番号も含まれています。 but:
- これは、悪名高い「インターフェイスの安定性保証」の対象外であり、明日または気まぐれに変更される可能性があります。
- systemd-shim のそっくりな D-Bus サーバーも同様です。
- 役に立たないものもそうです。
362
の存在 同様に保証されておらず、同様に uselessd によって複製されています。
ノッシュの検出
376
in nosh は 385
を作成します ディレクトリ。しかし、これは同等の systemd チェックの弱点を共有しています。
その他の非スターター:
- ノッシュ
393
設計上、ファイルシステムにパイプやソケットを作成せず、そもそも RPC API を持っていません。 - ノッシュ
409
従来、410
に API ソケットがあります。 、しかし nosh service を実行できます 他のシステム マネージャーの下にあるマネージャー。そのため、これではシステムがわかりません manager はプロセス #1 として実行されています。いずれにせよ、その名前自体は設定されません。呼び出されたものは何でも。 420
によって出力される nosh バージョン文字列の存在 、430
(systemd 互換シムがインストールされている場合) および441
(upstart 互換性シムがインストールされている場合) これらのツールは実行中のシステムのクエリを行わないため、ツールセットの存在のみを示します。
新興企業の検出
Upstart 独自の 458
D-Bus 経由で API 呼び出しを行い、公式のチェックは 467
を実行できることの両方をチェックすることです その出力には文字列「upstart」がどこかに含まれています。
ただし、systemd API と同様:
- API が明日にも使用できる、または気まぐれに変更されないという保証はありません。
- 一部の互換性シムが存在しない、または将来存在しないという保証はありません。
実際、すでに互換性シムが 1 つあります。 nosh には、upstart
478
にシムを提供する upstart 互換パッケージがあります。 、484
、497
、および506
コマンド。幸いなことに (これは意図的なものでしたが)、510
shim は「成り上がり」という言葉を発しません。root ~ #initctl version nosh version 1.14 root ~ #