Scroll to navigation

init(5) File Formats Manual init(5)

名前

init - Upstart init デーモンのジョブ設定です

概要

/etc/init

説明

起動時に Upstart init(8) デーモンは /etc/init ディレクトリからそのジョブ 設定を読み込み、inotify(7) を使用してその後の変化を監視します。

このディレクトリ内のファイルは .conf で終了する必要があり、サブディレクトリ内 にも存在することができます。

各ファイルは単独のファイル又はタスクを定義して、ディレクトリ内の相対パスから 取り出した名前を拡張子なしで付けます。例えば、/etc/init/rc-sysinit.conf で 定義されているジョブは rc-sysinit と言う名前であり、/etc/init/net/apache.conf で 定義されたジョブは net/apache と言う名前になります。

これらのファイルは平文で書かれており、実行可能ではありません。

形式

各行は設定スタンザで始まり、行の末尾か終止スタンザを含む行まで続きます。 スタンザ内での改行は一重引用符か、二重引用符内にある場合、あるいは逆スラッシュに 続く場合に可能になります。

スタンザとその引数は空白で境界点となります。空白とは1つ以上の空白、又はタブ 文字で構成されており、一重か二重の引用符で囲まれていない限りは通常無視される ものです。

コメントは`#' で始まり、行の末尾まで続きます。空白行と空白又はコメントのみで 構成される行は無視されます。

プロセスの定義

ジョブの主要役割は、init(8) デーモンで実行されるサービスやタスクを定義することです。 各ジョブはそのライフサイクルの一部として実行される一つ以上の異なるプロセスを持っています。 その中で最も一般的なものはメインプロセスと呼ばれます。

メインプロセスは、execscript のスタンザを使用して定義されます。 許可されるのは1つのみです。ジョブが稼働中と判断される時に実行される 実行ファイル、又はシェルスクリプトをスタンザが指定します。このプロセスが 終了すると、ジョブは停止します。

全てのプロセスは、それらのプロセス内の環境変数として利用可能な ジョブ環境全域で実行されます。

このスタンザは、実行されるプロセスをファイルシステム上の実行ファイル名として定義し、 そしてそれに渡すゼロ、又はそれ以上の引数を定義します。例えば引用句や`$' などの 指定された特殊記号は展開の為にコマンド全体がシェルに渡される動作を生じます。

exec /usr/sbin/acpid -c $EVENTSDIR -s $SOCKET
このスタンザは、sh(1). を使用して実行されるシェルスクリプトとして動作する プロセスを定義します。-e シェルオプションが常に使用されて、コマンドの失敗は いずれもスクリプトを停止させることになります。

script スタンザは単独で一行内に現れます。この時このスクリプトが全てですが それは最初の end script スタンザが単独で一行内に出現するまでです。

script

dd bs=1 if=/proc/kmsg of=$KMSGSINK
exec /sbin/klogd -P $KMSGSINK end script

ジョブのライフサイクルの一部として実行される追加の4つのプロセスがあります。 これらはプロセス名とそれに続く execscript のスタンザとして指定 されます。

このプロセスは、ジョブの starting(7) イベントが終了した後、しかし メインプロセスが実行される前に実行されます。これは標準的に、必要な ディレクトリの作成など、環境の準備の為に使用されます。
このプロセスは、ジョブの started(7) イベントが発信される前、しかし メインプロセスが産出(spawn)された後に実行されます。これは標準的に必要なコマンドを メインプロセスに送信するためか、あるいはメインプロセスがクライアントを受け取る 準備ができるまで started(7) イベントを遅らせるために使用されます。
このプロセスは、ジョブがその stop on スタンザ内の一覧にあるイベントで、 又は stop(8) コマンドで停止される場合に実行されます。これはジョブの stopping(7) イベントが発信される前で、メインプロセスがキルされる前に 実行されます。これは標準的に必要なシャットダウンコマンドをメインプロセスに 送信するために使用されて、またその停止をキャンセルするために引数無しの start(8) コマンドの呼び出もします。
このプロセスは、メインプロセスがキルされた後、そしてジョブの stopped(7) イベントが 発信される前に実行されます。これは一般的に一時ディレクトリの削除などのように環境の清掃に 使用されます。

メインプロセスも含めてこれらのプロセスは全て、オプションです。メインプロセスの無い サービスは停止されるまで稼働しているように見えます。これは一般的にランレベルなどの 状態を定義するために使用されます。状態を示すために pre-startpost-stop の プロセスは必要ですが、メインプロセスは持たなくても許容されます。

pre-start exec ifup -a
post-stop exec ifdown -a

イベントの定義

ジョブは、start(8)stop(8) のツールを使用していつでも システム管理者によて手動で開始と停止ができます。しかし、必要な時には init(8) デーモンによるジョブの自動開始と停止がずっと便利です。

これは、ジョブが開始される要因となるイベントと、再度プロセスを 停止する要因となるイベントを指定することで達成できます。

可能なイベントのセットは無制限ですが、ユーザーが使用するような標準イベントが init(8) デーモンと telinit(8) ツールで定義されています。

開始されると最初に init(8) デーモンは startup(7) イベントを発信します。 これが System V の互換性と runlevel(7) イベントを実装するジョブを起動 します。ジョブは開始と停止をするため、init(8) デーモンは、代理となって starting(7)started(7)stopping(7)stopped(7) を発信します。

start on スタンザは、ジョブが自動的に開始される要因となるイベントのセットを 定義します。各 EVENT には名前が付けられます。andor 演算子を 使用すると複数のイベントが認可されて、複雑な表現は括弧()を使用して実行されます。 括弧内では改行が可能になります。

KEY と期待値 VALUE を指定することにより、イベント内に含まれる 環境変数にマッチすることもできます。イベントに与えられる変数の順序が 判る場合は、KEY は省略できます。

VALUEfnmatch(3) で許可されているように、ワイルドカードマッチと glob(パターンマッチ)を含むことができて、env スタンザで定義されたどんな 変数値でも展開することができます。

否定は KEYVALUE の間に != を使用して可能になります。

start on started gdm or started kdm
start on device-added SUBSYSTEM=tty DEVPATH=ttyS*
start on net-device-added INTERFACE!=lo
stop on スタンザはジョブが自動的に停止する要因となるイベントのセットを 定義します。start on と同じ構文を持っています。

VALUE は更に、ジョブの開始環境(それを開始したイベントか、又はコマンド)から 来るどんな変数値でも展開することが出来ます

stop on stopping gdm or stopping kdm
stop on device-removed DEVPATH=$DEVPATH

ジョブの環境

各ジョブはそれを開始したイベントか、又はコマンドからの環境で実行されます。 更には、後で上書きされるジョブ内のデフォルトを定義して、ジョブ用に生成 されたイベントにエクスポートする環境変数を指定できます。

特殊なUPSTART_EVENTS 環境変数には、ジョブを開始したイベントの一覧が 含まれています。ジョブが手動で開始された場合は一覧は存在しません。

更には、pre-stoppost-stop のスクリプトは、ジョブを停止したイベントか、 コマンドの環境で実行されます。UPSTART_STOP_EVENTS 環境変数には、ジョブを停止した イベントの一覧が含まれており、ジョブが手動で停止された場合は一覧は存在しません。

全てのジョブはジョブとインスタンスの名前を持つ UPSTART_JOBUPSTART_INSTANCE の環境変数も含んでいます。これらは多くの場合、 initctl(8) ユーティリティによって使用され、コマンドの呼び出し元であるジョブ上の 動作がデフォルトとなります。

デフォルトの環境変数を定義します。この値はジョブを開始するイベントかコマンドにより 上書きされる可能性があります。
環境変数の値をこのジョブの starting(7)started(7)stopping(7)、 及び stopped(7) のイベントにエクスポートします。

サービス、タスク、及び再産出

ジョブはデフォルトで services です。これは、ジョブが実行している時には ジョブを開始する動作は完了と考慮されており、そしてゼロ退出ステータスでの 退出でさえもサービスは再産出されることを示唆すると言う意味です。

このスタンザは、ジョブが代わりに task であることを指定する為に使用されます。 これは、ジョブを開始する行為は、ジョブ自身が実行されて再度停止するまでは完了したと考慮されないと言う意味ですが、ゼロ退出ステータスでの退出はタスクが正しく完了して再産出は 起こらないと言う意味になります。

start(8) コマンド、及び starting(7)stopping(7) のイベントは サービスが稼働するまでか、又はタスクが終了するまでのみブロックします。

このスタンザを持つサービス、又はタスクは、異常に停止した場合に自動的に開始します。 stop(8) コマンド自身以外のサービス停止の理由はすべて異常と考慮されます。 タスクをゼロ退出ステータスで退出すると、再産出を阻止することができます。
再産出は限度に影響されます。ジョブが INTERVAL 秒内に COUNT 回以上 再産出した場合、より深い問題を持っていると考慮されて停止されます。

これは、restart(8) コマンドにではなく、自動再産出にのみ適用できるものです。

追加の退出ステータス、又はシグナルが追加できます。ジョブプロセスが これらのステータスのいずれかで停止すると、失敗とは見なされずに再産出は 起こりません。

normal exit 0 1 TERM HUP

インスタンス

デフォルトではいずれのジョブにも1度に1つのインスタンスのみが存在できます。 すでに開始していたり、実行中である時にジョブを開始する試みはエラーになります。

複数のインスタンス名を定義すると、複数のインスタンスが許可されます。 同名のインスタンスがまだ開始や実行していない場合は、新規のインスタンスは エラーなしに開始できます。

このスタンザはインスタンスの名前を定義します。これは単独で許可されるインスタンスの 名前を定義するだけであるため、それ自身のみではあまり役に立ちません。しかし、NAME は ジョブの環境内で定義されたいずれの変数も展開します。

これらは多くの場合、なんらかの方法でプロセスに渡す必要のある変数です。インスタンスを制限するための優れた手段となります。

instance $CONFFILE
exec /sbin/httpd -c $CONFFILE

instance $TTY
exec /sbin/getty -8 38300 $TTY

これらのジョブは、括弧内にインスタンス名を付けて initctl(8) 出力に 現れます。そして、INSTANCE 環境変数をそれらのイベントにセット させます。

ドキュメント

Upstart はドキュメント及びツールに役に立つ数種のスタンザを提供します。

このスタンザはジョブの説明を含むでしょう。

description "This does neat stuff"
このスタンザはバグ報告の連絡先としてよく使用されるジョブの著者を含むでしょう。

author "Scott James Remnant <scott@netsplit.com>"
このスタンザは、バージョンコントロール、又はパッケージバージョン番号などの ジョブに関するバージョン情報を含むでしょう。いかなる方法でも init(8) では使用されたり解釈されたりしません。

version "$Id$"
システム上の全てのプロセスは、initctl(8) ツールの使用により、又は init(8) と 通信することにより、プロセス自身のイベントを自由に発信することができます。

このスタンザにより、ジョブはそれ自身が発信するイベントをそのジョブ設定内で ドキュメント化することができ、起こりうる変遷のグラフ化に役立つかも知れません。

プロセスの環境

リソースの制限など、プロセス環境への多くの一般的調節は、ユーザー自身で対処することなく、 ジョブ内で直接設定できるかも知れません。

デフォルトでは、ジョブの標準入力、出力、及びエラーファイルの記述子は /dev/null に連結されています。

このスタンザが指定されていると、それは代わりに /dev/console に連結されます。

console owner は特別であり、これはジョブをシステムコンソールに連結させる だけでなく、そのジョブをシステムコンソールの所有者にセットします。これは、 Control-C などの特別なキーの組み合わせが押された時に、このスタンザが カーネルから特定のシグナルを受けると言う意味になります。

一般的な設定は、プロセスの為にファイルモード作成マスクをセットすることです。 UMASK は、マスク用に8進法の値でなければなりません。詳細は umask(2) で ご覧下さい。
もう一つの一般的な設定は、プロセスのナイス値を調節することです。詳細は nice(1) でご覧下さい。
普通は OOM キラーは全てのプロセスを同等に扱います。このスタンザは カーネルに対してこのジョブへの異なる扱いを指示します。

ADJUSTMENT-16 (OOM キラーにキルされる可能性極小)から 14(OOM キラーにキルされる可能性極大)までの整数値となります。 これはまた特殊値 never によって OOM キラーが完全にジョブを無視 するようにもできます。

ジョブのプロセスを DIR 以下の chroot(8) 環境で実行します。

プロセスを実行させる為には、 DIR が多くの場合 /bin/sh を含む全ての 必要なシステムライブラリ持っている必要があることに注意して下さい。

ファイルシステムの root の代わりに、 DIR の作業ディレクトリでジョブのプロセスを 実行します。
ジョブのプロセス用に初期システムリソースの限度をセットします。LIMIT は、 corecpudatafsizememlockmsgqueuenicenofilenprocrssrtpriosigpending、又は stack のいずれか1つになります。

限度は SOFT 値と HARD 値の両方で指定され、両方とも整数と なります。特殊値 unlimited はどちらの限度にでも指定できます。

その他

ジョブのメインプロセス SIGTERM と、実行中のジョブを停止する時の SIGKILL の両シグナルの送信間隔を指定します。
ジョブのメインプロセスは SIGSTOP シグナルを発してそれが準備完了である ことを指定します。init(8) はこのシグナルを待ってから、ジョブのポストスタート スクリプトを実行するか、あるいはジョブが実行中であると考慮します。

init(8) はプロセスに SIGCONT シグナルを発信してそれが継続できるように します。

ジョブのメインプロセスがデーモンであることを指定し、実行後に二回分岐します。 init(8) はこのデーモン化に追従して、その開始を待った後にジョブのポストスタート スクリプトを実行するか、又はジョブが実行中であると考慮します。

このスタンザがないと、 init(8) はデーモンプロセスを監督できない状態になり、 起動時にそれがデーモン化するとすぐに停止したと信じてしまいます。

ジョブのメインプロセスが実行後に分岐することを指定します。 init(8) はこの分岐に追従して、その発生を待った後に、ジョブの ポストスタートスクリプトを実行するか、又はジョブが実行中であると考慮します。

このスタンザがないと、init(8) は分岐プロセスを監督できない状態になり、 起動時に分岐が起こるとすぐにそれらが停止したと信じてしまいます。

補足参照

init(8) sh(1)

2010-02-04 Upstart