ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
![]() |
マニュアルページセクション 5: 標準、環境、マクロ Oracle Solaris 11 Information Library (日本語) |
- サービス管理フレームワークのメソッド規約
サービス管理フレームワーク smf(5) で svc.startd(1M) によって管理されるサービスのクラスは、単純な fork(2)-exec(2) モデルに適合するアプリケーションから成ります。svc.startd(1M) マスターデーモンとほかのリスタータは fork(2)-exec(2) モデルをサポートしており、追加の機能を備えている場合もあります。svc.startd(1M) デーモンとほかのリスタータにとっては、サービスインスタンスのアクティブ化、操作、または検査を行うメソッドがこのマニュアルページで説明されている規約に従っている必要があります。
メソッド呼び出しの形式は規約で規定されていません。メソッドの呼び出しは、デーモンまたはサービスを提供するほかの実行可能バイナリの直接呼び出しの場合もあります。実行可能スクリプトなどの間接実行可能ファイルを使用する場合は、規約では次の形式が推奨されています。
/path/to/method_executable abbr_method_name
この推奨形式の abbr_method_name は、start や stop など、サポートされているメソッドです。リスタータでサポートされているメソッドセットについては、そのリスタータの関連ページで説明されています。svc.startd(1M) デーモンは start、stop、および refresh メソッドをサポートしています。
リスタータには、このページで説明するメソッドのほかにも各種のメソッドが定義されていることがあります。そのような拡張も含めた規約はリスタータによって定義され、ここで説明する規約とは異なる場合があります。
リスタータは、メソッド呼び出しのコンテキストを決定する 4 つの環境変数をメソッドに提供します。
メソッド呼び出しの対象であるインスタンスのサービス障害管理リソース識別子 (FMRI)。
呼び出されるメソッドの完全な名前。start や stop など。
メソッドを呼び出すリスタータのサービス FMRI。
メソッドが実行されているゾーンの名前。これは zonename(1) コマンドでも取得できます。
メソッドで永続的プロセスを呼び出す場合は、その前にこれらの変数を環境から削除するようにしてください。サービスの作成者が Bourne 互換のシェルスクリプトを使用して後述のインクルードファイルにサービスメソッドを合成できるように、簡易シェル関数 smf_clear_env が用意されています。
後述のとおり、メソッドコンテキストによってほかの環境変数が設定されることもあります。
メソッドは、method タイプのプロパティーグループの 3 つのプロパティーで最小限定義されます。
これらのプロパティーは次のとおりです。
メソッドの実行可能ファイルの文字列。
メソッドがタイムアウトするまでの秒数。詳細については、「タイムアウト」の節を参照してください。
メソッドのタイプ。現在は常に method に設定されます。
メソッドコンテキストを定義して、メソッドの実行環境をより詳細に指定することもできます。詳細については、「メソッドコンテキスト」の節を参照してください。
リスタータ svc.startd によってメソッドの exec 文字列に一連のトークンが定義されている場合は、それらが解析され、適切な値で展開されます。ほかのリスタータはメソッドトークンをサポートしていない場合があります。inet サービスの委任リスタータ inetd(1M) は、次のメソッド展開をサポートしていません。
%
リスタータの名前。svc.startd など。
呼び出されるメソッドの完全な名前。start や stop など。
サービスの名前
インスタンスの名前
インスタンスの FMRI
プロパティーの値。prop は、プロパティーの FMRI、プロパティーグループ名とプロパティー名を / で区切ったもの、または application プロパティーグループ内のプロパティー名です。これらの値のあとに , (コンマ) または : (コロン) が続く場合があります。ある場合、その区切り文字が複数の値を区切るために使用されます。ない場合は、スペースが使用されます。次に示すシェルのメタキャラクタが文字列値の中に見つかった場合は、\ (バックスラッシュ) でクォートされます。
; & ( ) | ^ < > newline space tab \ " '
展開が正しくないとメソッドの失敗を招きます。
メソッドコマンドの代わりに、2 つの明示的なトークンを使用できます。
指定されたシグナルを主インスタンス契約のすべてのプロセスに送信します。デフォルトのシグナルは SIGTERM です。常に SMF_EXIT_OK を返します。このトークンは、一般的な pkill の呼び出しの代わりに使用するようにしてください。
常に SMF_EXIT_OK を返します。このトークンは、リスタータには必要であっても、特定のサービス実装には必要のないメソッドに使用するようにしてください。
start メソッドは、サービスインスタンスが要求に応答できる状態になるか、あるいは機能するまで、終了を遅らせる必要があります。
次の終了ステータスコードが <libscf.h> とシェルサポートファイルに定義されています。
|
正確な終了コードを使用することで、担当のリスタータでエラー応答を診断して、再起動が適切と考えられる断続的なエラーと、管理者の操作を必要とする永続的なエラーとに分類できます。
メソッドごとに個別のタイムアウトを秒単位で設定できます。特定のタイムアウトを選択する場合は、メソッドが応答しなくなったことによるメソッド失敗をサイトで検出できる見込みに基づくようにしてください。たとえば、複製されたファイルシステムなどのフェイルオーバーリソースを備えたサイトでは、メソッドのタイムアウトをデフォルト値より長くします。リモートリソースのないサイトでは、タイムアウトを短くすることができます。メソッドのタイムアウトは timeout_seconds プロパティーで指定されます。
メソッドに 0 timeout_seconds を指定すると、サービスにはタイムアウトが存在しないことをリスタータに対して宣言することになります。この設定は推奨されませんが、どうしてもそれを必要とするサービスのために用意されています。
-1 timeout_seconds も使用できますが、非推奨になった仕様です。
前述の終了ステータス値を定義する一連の環境変数が、/lib/svc/share/smf_include.sh ファイル内の簡易シェル関数で提供されます。このファイルは Bourne シェルスクリプトであり、任意の Bourne 互換シェルのソース演算子を介したインクルードに適しています。
SMF メソッドとして機能するスクリプトおよび /etc/init.d スクリプトの合成を容易にするために、smf_present() シェル関数が用意されています。smf(5) 機能を使用できない場合、smf_present() は 0 以外の終了ステータスを返します。
そのようなスクリプトの構造の例を次に示します。
if smf_present; then # Shell code to run application as managed service .... smf_clear_env else # Shell code to run application as /etc/init.d script .... fi
この例では、用意されている両方の簡易関数の使用方法が示されています。
サービス管理機能は、fork(2)-exec(2) モデルのサービスを実行するコンテキストを、共通のメカニズムセットに提供します。
必要なメソッドコンテキストはサービス開発者が指定するようにしてください。セキュリティーが損なわれることをできるだけ防ぐために、すべてのサービスインスタンスは最低限の特権で実行されるべきです。
メソッドコンテキストには次のプロパティーを含めることができます。
user、group、privileges、および limit_privileges プロパティーの代わりにプロファイルを使用するかどうかを指定するブール値。
メソッドの環境に挿入する環境変数を、いくつかの NAME=value 文字列で指定します。
RBAC (役割に基づくアクセス制御) プロファイルの名前。メソッドの実行可能ファイルとの組み合わせで、exec_attr(4) 内のエントリを識別します。
数値またはテキスト形式のユーザー ID。
数値またはテキスト形式のグループ ID。
補助グループメンバーシップを数値またはテキスト形式の ID で指定する、省略可能な文字列。
privileges(5) で定義されている特権セットを指定する、省略可能な文字列。
privileges(5) で定義されている制限特権セットを指定する、省略可能な文字列。
メソッドを起動するホームディレクトリ。トークンとして :home を使用すると、メソッドの起動に使用された uid に該当するユーザーのホームディレクトリを指定できます。このプロパティーが設定されていない場合は、:home が使用されます。
coreadm(1M) に従ってサービスに使用するコアファイルパターンを指定する、省略可能な文字列。ほとんどのリスタータにはデフォルトが用意されています。このプロパティーの設定は、グローバルなコアパターンをローカルでカスタマイズした設定よりも優先されます。
数値またはテキスト形式のプロジェクト ID。トークンとして :default を使用すると、メソッドの起動に使用された uid に該当するユーザーの、getdefaultproj(3PROJECT) で識別されるプロジェクトを指定できます。
メソッドを起動するリソースプールの名前。トークンとして :default を使用すると、上記の project 属性で示された project(4) エントリに指定されているプールを指定できます。
サービスまたはインスタンスの method_context プロパティーグループを指定することにより、サービスインスタンス全体のメソッドコンテキストを設定できます。メソッドプロパティーグループのメソッドコンテキストプロパティーを指定することで、メソッドがインスタンスのメソッドコンテキストを上書きする場合もあります。
メソッドコンテキストの設定が正しくないと、メソッドは常に失敗しますが、環境変数が無効な場合は警告が発行されます。
上記で定義されるコンテキストに加え、fork(2)-exec(2) モデルのリスタータは、実行可能ファイルをメソッドとして呼び出すときに次の規約も使用します。
argv[] 内の引数は、exec 文字列の /bin/sh -c の結果と一致するように設定されます。
ファイル記述子 0 は /dev/null です。ファイル記述子 1 と 2 は、サービスごとのログファイルに推奨されます。
終了ステータス値の定義。
終了ステータスコードの定義。
zonename(1), coreadm(1M), inetd(1M), svccfg(1M), svc.startd(1M), exec(2), fork(2), getdefaultproj(3PROJECT), exec_attr(4), project(4), service_bundle(4), attributes(5), privileges(5), rbac(5), smf(5), smf_bootstrap(5), zones(5)
smf(5) の現在のバージョンでは、複数のリポジトリはサポートされていません。
サービスが limit_privileges とは異なる特権で root ユーザーとして起動するように構成されている場合、結果として得られるプロセスは特権に対応したものになります。これは、seteuid(<non-zero UID>) によって特権が basic 以下に下がると考えている開発者には予期しないことです。