Linuxのinitプロセスのジョブ設定

initプロセスが管理する対象は”ジョブ”と呼ばれていて、その各ジョブの設定方法についてまとめました

(1)概要


 
・OS起動時にinitデーモンは/etc/initディレクトリ内にあるジョブ設定ファイルを読んで各ジョブを起動します。
 
・ジョブの設定ファイルには、.confと.overrideの2種類あります。
 
.overrideファイルは、同じ名前の.confファイルの設定内容に対する追加(上書き)設定で、.confファイルを直接修正せずに設定内容を変更できるメリットがあります。
 
・それぞれの設定ファイルでは、一つのサービス(長期間実行されるプロセスまたはデーモン)またはタスク(短期間実行されるプロセス)のテンプレートを定義します。
 
・設定ファイルそのものは”ジョブ”ではなく、ジョブが実行される環境を記述したものです。
 
設定ファイルの記述を具現化したランタイムがジョブです。
 
・Upstartや関連するツールで表示される設定ファイル名は下記ルールに従います。
 
/etc/initディレクトリ内
 /etc/init/rc-sysinit.conf → rc-sysinit
 
/etc/initディレクトリ内のサブディレクトリ内
 /etc/init/net/apache.conf → net/apache
 
 

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


 
1)ジョブの設定ファイルの例
 
$ more tty.conf

# tty - getty
#
# This service maintains a getty on the specified device.

stop on runlevel [S016]

respawn
instance $TTY
exec /sbin/mingetty $TTY
usage 'tty TTY=/dev/ttyX  - where X is console id'

2)ジョブの設定ファイルのフォーマット
 
・各行は、設定スタンザから始まり、行末またはクロージングスタンザを含む行まで続く。
 
・スタンザ内でもシングルまたはダブルクォート内、またはバックスラッシュの後であれば改行コードを使用できる。
 
・重複したスタンザは最後のスタンザが有効になる。
 
・認識されないスタンザがあるとparseエラーでジョブの実行が停止される。
 
・スタンザとその引数は、空白文字、タブで区切られる。
 
・”#”から始まり、行末まで内容はコメントとして無視される。
 

(3)設定ファイル内でのプロセス定義


 
ジョブの設定ファイルで記述するプロセス定義の方法についてです。
 
●概要
 
・initデーモンによって実行されるサービスまたはタスクを定義します。
 
・それぞれのジョブは、それらのライフタイムの一部として実行されるメインプロセスなどのプロセスを持ちます。
 
・メインプロセスは”exec”または”script”スタンザを使って定義されます。
 
●exec COMMAND [ ARG ]…
 
・実行ファイルの名前を指定して実行されるプロセスを定義
 
・例
exec /usr/sbin/acpid -c $EVENTSDIR -s $SOCKET
 
●script … end script
 
・”sh”を使って実行されるスクリプトとして実行されるプロセスを定義
 
・例
script
 dd bs=1 if=/proc/kmsg of=$KMSGSINK
 exec /sbin/klogd -P $KMSGSINK
end script
 
●pre-start exec|script…
 
・メインプロセスが実行される前でジョブのstartingイベント後に実行されるプロセス。
 
・必要なディレクトリの作成など環境の準備に使用される事が多い。
 
●post-start exec|script…
 
・メインプロセスが呼び出された後、ジョブのstartedイベントの前に実行されるプロセス。
 
・メインプロセスに必要なコマンドを送ったり、メインプロセスがクライアントに対する準備が整うまでstartedイベントを遅延させるなどの目的で使用される。
 
●pre-stop exec|script…
 
・stopコマンドまたは”stop on”スタンザによって停止する場合に実行されるプロセス。
 
・ジョブのstoppingイベントが発行される前やメインプロセスがkillされる前に実行される。
 
・メインプロセスにシャットダウンコマンドを送信する際やstopをキャンセルする引数を指定せずにstartをコールする際に使用される。
 
●post-stop exec|script…
 
・メインプロセスがkillされた後、ジョブのstoppedイベントが発行された後に実行されるプロセス。
 
・一時ディレクトリの削除など環境のクリーンアップに使用される。
 

(4)設定ファイル内でのイベント定義


 
ジョブの設定ファイルで記述するイベント定義の方法についてです。
 
●概要
 
・ジョブは、管理者がstart、stopツールを使って手動で起動、停止する事が出来ますが、必要に応じてinitデーモンによって自動で起動、停止できます。
 
・上記自動起動・停止は、イベント定義によって制御できます。
 
●start on EVENT [[KEY=]VALUE]… [and|or…]
 
・”start on”スタンザは、ジョブを自動起動させるイベントのセットを定義する。
 
・”and”、”or”を使って複数のイベントを指定出来る。
 
・”KEY”、”VALUE”を使って、イベント内に含まれる環境変数とマッチングさせる事が出来る。
 
・例
start on started gdm or started kdm
start on device-added SUBSYSTEM=tty DEVPATH=ttyS*
start on net-device-added INTERFACE!=lo
 
●stop on EVENT [[KEY=]VALUE]… [and|or…]
 
・”start on”と同じ。
 
・”VALUE”は、ジョブの開始環境から引き継がれた値を拡張する事が出来る。
 
・例
stop on stopping gdm or stopping kdm
stop on device-removed DEVPATH=$DEVPATH
 

(5)環境変数


 
initプロセスが管理するジョブで使用する環境変数についてです。
 
●概要
 
・それぞれのジョブは、ジョブを起動したイベントまたはコマンドからの環境を引き継いで実行されます。
 
・”UPSTART_EVENTS”という環境変数には、そのジョブを開始したイベントのリストを含んでいます。ただし、ジョブが手動で起動された場合は存在しない場合もあります。
 
・”pre-stop”、”post-stop”スクリプトは、ジョブを停止するイベントまたはコマンドの環境を引き継いで実行されます。
 
・”UPSTART_STOP_EVENTS”という環境変数には、そのジョブを停止したイベントのリストを含んでいます。ただし、ジョブが手動で起動された場合は存在しない場合もあります。
 
・すべてのジョブは、”UPSTART_JOB”、”UPSTART_INSTANCE”という環境変数を持ち、ジョブやインスタンスの名前を含んでいます。
 
・上記環境変数は、initctlによって多く使用されます。
 
●env KEY=VALUE
 
・デフォルトの環境変数を定義する。
 
・ジョブを開始するイベントまたはコマンドによってオーバーライドされることもある。
 
●export KEY
 
・環境変数の値をこのジョブのstarting、started、stopping、stoppedイベントにエクスポートする。
 

(6)サービス、タスク、respawn


 
●概要
 
・ジョブはデフォルトでサービスで、そのジョブを開始するactはジョブが実行している時には終了されていることになります。
 
そして、ゼロのexitステータスでexitしたとき、そのサービスはrespawnされます
 
●taskスタンザ
 
・そのジョブがサービスではなく、タスクである事を指定する
 
この場合はサービスの場合と異なり、ジョブそのものが実行されていて再び停止するまでジョブを開始するactは終了していないことを意味する。
 
そしてゼロのexitスタータスでexitしたとき、そのタスクは完全に終了し、respawnされない。
 
・”start”コマンド、”starting”イベント、”stopping”イベントは、サービス実行中のみ、または、タスクが終了するまでブロックされる。
 
●respawnスタンザ
 
・サービス、タスクは、異常終了した場合は自動で起動される。
 
・”stop”コマンドによって終了した場合以外は、サービスの終了は異常終了とみなされる。
 
・ゼロのexitステータスコードでexitしたタスクはrespawnされない。
 
●respawn limit COUNT INTERVAL
 
・ある時間内に一定数以上respawnしないように設定。
 
・デフォルトは、COUNT数が10、INTERVALが5秒。
 
・この設定は自動でrespawnされた場合のみで、”restart”コマンドには適用されない。
 
●normal exit STATUS|SIGNAL…
 
・追加のexitステータスやシグナルを追加する。
 
ここで設定したステータスやシグナルでジョブプロセスが終了した場合は、フェールしたとみなさず、respawnされない。
 
・例
normal exit 0 1 TERM HUP
 

(7)インスタンス

initプロセスが管理するジョブ設定ファイル内のインスタンスの設定についてです。
 
●概要
 
・同時に存在できるジョブのインスタンス数は一つのみです。
 
すでに開始中または実行中にジョブを開始しようとするとエラーになります。
 
・インスタンスの名前が定義されている場合は、同時に複数のインスタンスを実行する事もできます。同じ名前のインスタンスが開始中または実行中でなければエラーが発生せずに開始できます。
 
●instance スタンザ
 
・書式
instance NAME
 
・このインスタンス名は、プロセスにジョブではなく個々のインスタンスを指定する場合に有用。
 
例1)
instance $CONFFILE
exec /sbin/httpd -c $CONFFILE
 
例2)
instance $TTY
exec /sbin/getty -8 38300 $TTY
 
・initctl listなどの出力では、複数のインスタンスを持つジョブは、ジョブ名のあとに括弧でインスタンス名が記述されて表示され、イベント内ではINSTANCE環境変数にセットされる。
 

(8)プロセス環境


 
initプロセスが管理するジョブ設定ファイル内のプロセス環境についてです。
 
●概要
 
リソースリミットなどプロセス環境に対して行われる設定をジョブ内で直接設定する事が出来ます。
 
●console output|owner
 
・デフォルトでは、ジョブの入力、出力、エラーファイルディスクリプタは”/dev/null”に設定されている。
 
この設定によって”/dev/console”に接続する事が出来る。
 
・”owner”を設定するとシステムコンソールに接続すると同時にシステムコンソールのオーナーにも接続する。
 
これによって”Ctrl-C”などがキー操作されるとカーネルからのシグナルを受信する事が出来る。
 
●umask UMASK
 
・そのプロセス用にumaskを設定
 
●nice NICE
 
・プロセスのnice値を設定
 
●oom ADJUSTMENT|never
 
・OOM killer(Out of Memory Killer)
 
メモリーを使い切り、必要なメモリー領域を確保出来ない場合にプロセスを強制終了させて空きメモリーを確保する仕組み。
 
・OOM killerがどのプロセスを強制終了させるか判断する場合、通常はすべてのプロセスが同等に扱われるが、この設定によって優劣をつけて判断材料を与える。
 
・ADJUSTMENTは、-16~14の数値で大きい値ほど強制終了されやすい。
 
・neverにすると強制終了の対象からはずされる。
 
●chroot DIR
 
・このジョブのプロセスを指定したディレクトリのchroot環境で実行させる。
 
●limit LIMIT SOFT|unlimited HARD|unlimited
 
・ジョブプロセスにシステムリソースリミットを設定する。
 
・LIMITには、下記のいずれかを指定
core, cpu, data, fsize, memlock, msgqueue,nice, nofile, nproc, rss, rtprio, sigpending ,stack
 

(9)kill、expect


 
initプロセスが管理するジョブ設定ファイルでプロセスのkillタイムアウト、デーモン、フォークに関する設定方法についてです。
 
●kill timeout INTERVAL
 
・実行中のジョブを停止する際にジョブのメインプロセスにシグナルを送りますが、SIGTERMとSIGKILLシグナル間のインターバルを指定する。
 
デフォルトは5秒。
 
●expect stop
 
・ジョブのメインプロセスが実行準備状態になるとSIGSTOPシグナルを送信する。
 
これによってinitは、ジョブのpost-startスクリプトが実行中または実行中と判断できるようになるまでこのシグナルを待機するようになる。
 
initは、このプロセスにcontinueを許可するのにSIGCONTシグナルを送信する。
 
●expect daemon
 
・ジョブのメインプロセスがデーモンとして動作するように指定する。実行されるまでに2回フォークされる。
 
・initはこのデーモン処理に続いて、ジョブのpost-startスクリプトが実行中または実行中と判断できるようになるまで待機する。
  
・このスタンザがないとinitはデーモンプロセスを管理できず、デーモン処理の開始後すぐに停止したと判断しなければならなくなる。
 
●expect fork
 
・実行後、ジョブのメインプロセスが一度フォークするように指定する。
 
・initはこのフォーク処理に続いて、ジョブのpost-startスクリプトが実行中または実行中と判断できるようになるまで待機する。
 
・このスタンザがないとinitはフォークプロセスを管理できず、フォーク処理の開始後すぐに停止したと判断しなければならなくなる。

関連記事の目次

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です