Go to main content
Oracle® Solaris 11.3 でのシステムサービスの開発

印刷ビューの終了

更新: 2016 年 11 月
 
 

サービスインスタンスメソッドの作成

起動メソッドは、サービスインスタンスの作業を実行します。その他のメソッドは、たとえばサービスインスタンスを無効にしたりリフレッシュしたりするために必要なタスクを実行します。

サービスマニフェストまたはプロファイルで、メソッドは、name および exec 属性が含まれる exec_method 要素で定義されます。name 属性に指定できる値は、リスタータのマニュアルページに記載されています。たとえば、svc.startd(1M) のマニュアルページで説明されているように、マスターリスタータ /lib/svc/bin/svc.startd では、startstop、および refresh の各メソッドがサポートされます。

restart メソッドはありません。svcadm restart および svccfg restart コマンドは、stop メソッド、start メソッドの順に実行します。

exec 属性は、メソッドが実行する動作を定義します。exec 属性に指定できる値には、次の例に示されているように、カスタムメソッドスクリプト、既存の実行可能ファイル、または SMF で定義されている特殊なトークンが含まれます。

exec='/lib/svc/method/tcsd.sh start'

慣例により、この例に示されているカスタムのスクリプトは、メソッドの name 属性の値を指定する引数を取ります。この方法で、そのサービスインスタンスのすべてのメソッドに同じスクリプトを使用できます。

exec='/usr/lib/zones/zonestatd'

この例では、既存の実行可能ファイルを指定します。

exec=':true'
exec=':kill'

トークン :kill および :true については、smf_method(5) のマニュアルページで説明されています。:true トークンは、リスタータで必要でも特定のサービスインスタンスの実装には必要ではないメソッドに使用してください。

:kill トークンを使用すると、プライマリサービス契約内のすべてのプロセスが強制終了されるため、stop メソッドに最適です。一般に、契約内のプロセスがシグナルを正常に処理するようにプログラミングされていなければ、refresh メソッドで :kill が実行されないはずです。

サービスメソッドスクリプト

スクリプトであるメソッドは、たとえば Bourne シェル互換のスクリプトまたは Python スクリプトにできます。

  • ファイル /lib/svc/share/smf_include.sh は、Bourne シェル互換のメソッドスクリプト用のヘルパー関数を多数定義します。

  • ファイル /usr/lib/python-version/vendor-packages/smf_include.py は、Python に一意の次の関数を含む、Python メソッドスクリプト用のヘルパー関数を多数定義します。

    • smf_subprocess() – サブプロセス内の指定した実行可能ファイルを開始します。プロセスは即時に返され、インスタンスは契約サービスとして機能できます。

    • smf_main() – フレーム検査を使用して、メソッドスクリプトから適切な関数を呼び出します。/usr/lib/python-version/vendor-packages/smf_include.py ファイルのコメントを参照してください。

  • ファイル /lib/svc/share/smf_exit_codes.sh は、メソッドの終了コードを定義します。

smf_method_exit() 関数を使用して、メソッドスクリプトの終了をサービスインスタンスのログファイルで文書化します。smf_method_exit() 関数は、終了コード、終了理由を要約したトークン、および終了の詳細を説明していることがある文字列を取ります。smf_method_exit() 関数の構文については、smf_method_exit(3SCF) のマニュアルページを参照してください。終了コードのリストについては、/lib/svc/share/smf_exit_codes.sh を参照してください。

サービスタスクのセキュリティー保護

サービスを実行できるユーザーを制限したり、サービスを実行するためにユーザーが必要な特権を指定するには、次のオプションのいずれかを使用します。

  • プロパティー値を読み取り、サービスプロパティーおよびプロパティー値を変更し、サービス上でアクションを実行するために必要な承認を指定するには、*_authorization プロパティーを使用します。詳細は、smf_security(5) のマニュアルページを参照してください。

  • 次のプロパティーの値として要件を指定するには、method_credential 要素を使用します。

    • user。数値またはテキスト形式のユーザー ID。空または :default の場合は、uid 0 およびデフォルトのホームディレクトリ / が使用されます。

    • group。数値またはテキスト形式のグループ ID。空または:default の場合は、passwd データベースでユーザーに関連付けられたグループが使用されます。

    • supp_groups。メソッドに関連付けられる補助グループ ID。コンマまたは空白で区切られます。空白または :default の場合は、initgroups(3C) が使用されます。

    • privileges。コンマで区切られた特権のリスト。privileges(5) のマニュアルページを参照してください。

    • limit_privileges。コンマで区切られた特権のリスト。privileges(5) のマニュアルページを参照してください。

    Oracle データベースインスタンスを管理するサービスの作成では、インスタンス制御サービスおよびリスナーサービスによって、グループ dba 内のユーザー oracle が実行する必要があるサービスが指定されます。

    network/ntp サービスには、privileges プロパティーの値として必要な承認のリストが表示されます。

    network/physical サービスには、supp_groups プロパティーの使用が表示されます。

  • 使用するメソッドの権利プロファイルを指定します。MySQL および Apache の例については、Oracle Solaris 11.3 でのユーザーとプロセスのセキュリティー保護 の 拡張特権を使用したリソースのロックダウンを参照してください。