今さらだけど、startparについて

DebianではJesseからsystemdが決まっているなどで、
今さらではあるのだけど、Sysvinitで使用されているユーティリティの一つ
「startpar」の主に設定ファイルを調べて見ました。

startparとは

ランレベルスクリプトをパラレルに実行してくれる実行ファイル

  • /sbin/startpar


設定ファイル「/etc/init.d/.depend.{boot,start,stop}」に、
/etc/init.d/以下のシェルスクリプトの依存関係を記述する


startparは、設定ファイルに記述された依存関係にしたがって、
並列にシェルスクリプトを実行していく


なお、それぞれのシェルスクリプト中の出力(echoなど)は、
バッファに貯められ、シェルスクリプトの実行終了時に書き出される

  • なので、並列に実行していても、起動ログ上で出力が混ざることはない

startparまでのコールグラフ

Debian Wheezyでは、/etc/inittabに以下の3行があるため、

id:2:initdefault:
...
si::sysinit:/etc/init.d/rcS
...
l2:2:wait:/etc/init.d/rc 2
...


起動時に、ランレベル
S -> 2
と変わる


/sbin/initからstartparが呼ばれるまでのコールグラフ

  • /sbin/init <=(設定読み込み)= /etc/inittab
    • /etc/init.d/rcS
      • /etc/init.d/rc S(74行目):startup boot
        • startpar -p 4 -t 20 -T 3 -M boot -P N -R S <=(設定読み込み)= /etc/init.d/.depend.boot
    • /etc/init.d/rc 2(196行目):startup start
      • startpar -p 4 -t 20 -T 3 -M start -P N -R 2 <=(設定読み込み)= /etc/init.d/.depend.start

設定ファイルのフォーマット

例)

TARGETS = scriptA.sh scriptB.sh scriptC.sh
INTERACTIVE = scriptB.sh
scriptB.sh: scriptC.sh


例のような書き方をした場合、以下のような実行順序になる

「scriptA.sh・scriptC.sh並列実行」 -> 「scriptB.sh実行」


依存関係の書き方はMakefileをイメージするとわかりやすい


TARGETSには、登場するすべてのシェルスクリプトファイル名を書く
なお、登場するシェルスクリプトは、
/etc/init.d/
の中の物を参照する


INTERACTIVEには、シェルスクリプトのシェバンで
shに-eオプションをつけているものを列挙する


シェルスクリプト1: シェルスクリプト2 シェルスクリプト3 ...
ではシェルスクリプトの依存関係を示しており、
この場合は、「シェルスクリプト2 シェルスクリプト3 ...」の実行が完了しないと
シェルスクリプト1」は実行できないことを示す。


なお、いつ実行しても良いシェルスクリプトは依存関係の行には書かなくて良い

  • TARGETSにのみ含まれる


また、依存されるだけで、自身はどのシェルスクリプトにも依存していないシェルスクリプトは、
TARGETSと、依存関係の行の:(コロン)右側にのみ現れる

  • これもまた、「いつ実行しても良い」ことになる