リソースタイプ実装の Stop コールバックメソッドは、クラスタノードでアプリケーションを停止するときに RGM によって呼び出されます。
Stop メソッドのコールバックが有効であるためには、次の条件が必要です。
Stop メソッドは結果に依存しない命令 (idempotent) でなければなりません。つまり、Stop メソッドは、そのノードで Start メソッドが正常に終了していなくても、RGM によって呼び出されることがあります。したがって、Stop メソッドは、そのクラスタノードでアプリケーションが動作していない場合でも (したがって、特別な処理が必要ない場合でも)、正常に (終了コード 0 で) 終了しなければなりません。
リソースタイプの Stop メソッドが、あるクラスタノードで失敗に終わると (0 以外で終了)、停止中のリソースは STOP_FAILED の状態になります。リソースの Failover_mode 設定によっては、この条件により、クラスタノードが RGM によってハードウェア的に再起動されることがあります。
したがって、Stop メソッドの設計時には、このメソッドがアプリケーションを明示的に停止する手段が必要です。アプリケーションが停止しない場合は、SIGKILL などを使って、アプリケーションを強制的かつ即時に停止する必要があります。
さらに、このメソッドによるアプリケーションの停止は一定の時間内に行われなければなりません。Stop_timeout プロパティーで設定した時間が経過すると、停止が失敗したものとみなされ、リソースは STOP_FAILED の状態になるからです。
ほとんどのアプリケーションには、DSDL ユーティリティー scds_pmf_stop() で十分なはずです。これは、アプリケーションを SIGTERM で「静かに」停止しようとするためです。続いてこの関数は、プロセスに対してSIGKILL を適用します。この関数は、まず、アプリケーションが PMF の scds_pmf_start() で起動されたものとみなします。このユーティリティーの詳細については、「PMF 関数」を参照してください。
アプリケーションを停止するそのアプリケーション固有の関数を svc_stop() とするなら、Stop メソッドは、次のように実装します。
if (scds_initialize(&handle, argc, argv)!= SCHA_ERR_NOERR) { return (1); /* Initialization Error */ } return (svc_stop(handle));
前述の svc_stop() 関数の実装に scds_pmf_stop() 関数が含まれているかどうかは、ここでは関係ありません。scds_pmf_stop() 関数を含めるかの決定は、アプリケーションが PMF のもとで Start メソッドによって起動されているかどうかに依存します。
Stop メソッドの実装では、svc_validate() メソッドは使用されません。システムに問題があったとしても、Stop メソッドは、このノードでこのアプリケーションを停止すべきだからです。