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)停止应用程序(假设它是通过 scds_pmf_start() 在 PMF 控制下启动的),然后向进程发送 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));
svc_validate() 方法不用于 Stop 方法的实现,因为即使系统当前存在问题,Stop 方法应试图停止此节点上的应用程序。