web-dev-qa-db-ja.com

一部のスクリプトがdebianinit中に一定のリソースを必要とするのはなぜですか?

Initスクリプトを研究していると、いくつかの補助関数を何度も何度も再ソースする必要がある理由に戸惑います。具体的には、/lib/lsb/init-functionsにあるロギング関数。ログメッセージが必要なすべてのスクリプトは、それを再ソースする必要があります。なぜ一度はそれを実行できないのでしょうか。

これは、新しいinitスクリプトがそれぞれ独自のシェルで実行されているかのようです。もしそうなら、なぜそれはそのようになりますか?同じ問題が「vars.sh」で発生しますが、これは常に再ソースする必要があります。これは必要ですか?適切なランレベルで実行するスクリプトのリストに「init-functions」と「vars.sh」が追加されたとしましょう。

6
Ray Andrews

たくさんの質問...

あなたの質問に対する基本的な答えは「はい」です。各スクリプトは独自のシェルで実行されます。つまり、実行される各プロセスには、基本環境のコピー+このソーシングに含まれるこれらの変数+含まれる追加の環境変数が含まれます。サービスの開始時。

これらのインクルードをvars.shのようにランレベルレベルに移動することは、すべてのシェルがそのランレベルにそれらを持っているため、悪い考えです。これらのスクリプトが作成している配管の多くは、ソースされているこれらのファイルの副産物である結果のシェル内で実行されているサービスに非常に固有です。

また、多くはバッファリングおよびキャッシュされ、たとえば、ブロックはディスクから読み取られるため、これらのファイルの後続の再読み取りのために毎回ディスクにアクセスする必要はありません。これは、システムを見て、大量のRAMを消費していることを確認したときに起こっていることの一部です。

$ free -m
             total       used       free     shared    buffers     cached
Mem:          7782       7086        696          0        218        883
-/+ buffers/cache:       5984       1797
Swap:         7823       1550       6273

-/+ buffers/cache行は、ディスクI/Oに関連するこれらのタイプのブロックのキャッシュです。

今後の方向性

Initの多くは System V から派生しています(完全な履歴については initに関するWikipediaの記事 を参照してください)。今日の基準では時代遅れですが、約20年間はうまく機能しています。しかし、それが不足している領域は間違いなくあります。

そのため、これらに対処するために、2人の新規参入者 Systemdpstart が開発され、さまざまなLinuxディストリビューションで採用され始めています。

ss #1

Upstartの採用は、ジェットコースターのようなものです。 Canonicalによって開発されたため、かなり長い間Ubuntuに使用されており、systemdに切り替える前は、Fedora、RHEL、CentOS、openSUSEの一部でした。それは実際にはまだある程度RHELとCentOSにあります。

これらのシステムはどちらも、特にサービスを並行して開始できるという点で、SysVinitを大幅に改善しています。 initの主要な欠陥の1つ。しかし、これらのシステムでは、vimでいくつかのスクリプトを開き、起動ルーチンを微調整するという単純さがなくなりました。これらは両方とも本格的なテクノロジーであり、理解するのに時間がかかります。

10
slm

私が見た限りでは、/etc/init.d//etc/networkのスクリプトのみが/lib/lsb/init-functionsのファイルを調達しており、スクリプトごとに1回だけ、各スクリプトが調達する必要があります。各スクリプトを個別に開始できるため、1回です。

[編集#1]

知っておくべき重要なことは、ファイルが一度読み取られると、システムによってキャッシュされるということです。したがって、ファイルを再度読み取る必要がある場合でも、時間はかかりません。さらに、/etc/lsb/init-functions内のファイルには、サブルーチンの定義のみが含まれており、ソースされたときに実行されません。

[編集#2]

これをもう一度確認し、スクリプトのソースにかかる時間を知りたいと思いました。そこで、他のプロセスが測定を妨げないように、init1に切り替えました。結果は次のとおりです。

find /lib/lsb -type f -ls
9951842    4 -rw-r--r--   1 root     root         1088 Jun  5  2013 /lib/lsb/init-functions.d/20-left-info-blocks  
9952149    4 -rw-r--r--   1 root     root         2408 Dec 31 19:24 /lib/lsb/init-functions.d/40-systemd  
9951841   12 -rw-r--r--   1 root     root        11506 May 15  2013 /lib/lsb/init-functions 

つまり、これらは3つのスクリプトと約15kのストレージです

テストは単純なbashループです

time bash -c 'for i in {1..10000}; do source /lib/lsb/init-functions; done'
real   0m27.342s
user   0m17.756s
sys    0m1.328s

これは、3.4Ghz Core 2Duoで1つのスクリプトをソースするのに平均27.342/10000/3 = 0.0009秒であることを意味します。

1
user55518