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

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

※目次をクリックすると目次の下部にコンテンツが表示されます。

概要
・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

設定ファイルのフォーマット
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エラーでジョブの実行が停止される。
 
・スタンザとその引数は、空白文字、タブで区切られる。
 
・”#”から始まり、行末まで内容はコメントとして無視される。

設定ファイル内でのプロセス定義
●概要
 
・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イベント後に実行されるプロセス。
・必要なディレクトリの作成など環境の準備に使用される事が多い。
 
※イベントについては以下の記事を参照。
Linuxのinitプロセスの概要
 
●post-start exec|script…
 
・メインプロセスが呼び出された後、ジョブのstartedイベントの前に実行されるプロセス。
・メインプロセスに必要なコマンドを送ったり、メインプロセスがクライアントに対する準備が整うまでstartedイベントを遅延させるなどの目的で使用される。
 
●pre-stop exec|script…
 
・stopコマンドまたは”stop on”スタンザによって停止する場合に実行されるプロセス。
・ジョブのstoppingイベントが発行される前やメインプロセスがkillされる前に実行される。
・メインプロセスにシャットダウンコマンドを送信する際やstopをキャンセルする引数を指定せずにstartをコールする際に使用される。
 
●post-stop exec|script…
 
・メインプロセスがkillされた後、ジョブのstoppedイベントが発行された後に実行されるプロセス。
・一時ディレクトリの削除など環境のクリーンアップに使用される。

設定ファイル内でのイベント定義
●概要
 
・ジョブは、管理者が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 stopped rc RUNLEVEL=5
start on runlevel S or stopping rc RUNLEVEL=[234]
 
●stop on EVENT [[KEY=]VALUE]… [and|or…]
 
・”start on”と同じ。
・”VALUE”は、ジョブの開始環境から引き継がれた値を拡張する事が出来る。
例)
stop on stopping gdm or stopping kdm

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

サービス、タスク、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

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

プロセス環境
●概要
 
リソースリミットなどプロセス環境に対して行われる設定をジョブ内で直接設定する事が出来る。
 
●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

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はフォークプロセスを管理できず、フォーク処理の開始後すぐに停止したと判断しなければならなくなる。

関連記事の目次

コメントを残す

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