RGM 将对群集节点调用资源类型实现的 Stop 回调方法,以停止该应用程序。Stop 方法的回调语义要求:
Stop 方法必须具有幂等性,这是因为即使 Start 方法在节点上未成功完成,RGM 也可以调用 Stop 方法。因此,即使应用程序未在群集节点上运行并且没有要执行的操作,Stop 方法也必须成功(在返回零的情况下退出)。
如果资源类型的 Stop 方法在群集节点上失败(在返回非零值的情况下退出),则要停止的资源将在 STO_FAILED 状态下停止。是否会导致 RGM 对群集节点进行硬重新引导,这取决于资源的 Failover_mode 设置。因而,Stop 方法的设计很重要,它应当尽力尝试真正停止应用程序,当这样做仍无法终止应用程序时,甚至可以采取强行立即终止应用程序的办法(例如使用 SIGKILL)。还应确保它及时地执行此操作,因为框架将 Stop_timeout 期满视作停止失败,并使资源处于 STOP_FAILED 状态。
对于大多数应用程序来说,DSDL 实用程序 scds_pmf_stop() 应足以满足其使用要求,首先它将尝试以缓和的方式(通过 SIGTERM)停止该应用程序(假设该应用程序是在 PMF 控制下通过 scds_pmf_start() 启动的),然后向该进程传送 SIGKILL。有关此实用程序的更多信息,请参见PMF 函数。
以下是迄今为止我们一直在使用的代码模型,其中假设用来停止应用程序的应用程序特定函数为 svc_stop()(svc_stop() 的实现是否使用 scds_pmf_stop() 与此处介绍的内容无关,而是取决于该应用程序是否是在 PMF 控制下通过 Start 方法启动的),Stop 方法可用以下方式实现:
if (scds_initialize(&handle, argc, argv)!= SCHA_ERR_NOERR) { return (1); /* Initialization Error */ } return (svc_stop(handle));
不在 Stop 方法的实现中使用 svc_validate() 方法,因为即使当前系统中有问题,Stop 方法也应尝试在此节点上停止应用程序。