RGM 将对群集节点调用资源类型实现的 Stop 回调方法,以停止该应用程序。Stop 方法的回调语义学需要以下因素:
Stop 方法必须是幂等方法,因为即使 Start 方法在节点上没有成功完成,Stop 方法也可以被 RGM 调用。因此,即使应用程序当前没有在群集节点上运行并且没有需要它执行的工作,Stop 方法也必须成功(退出零)。
如果资源类型的 Stop 方法在群集节点上失败(退出非零值),则正被停止的资源将进入 STOP_FAILED 状态。根据资源上的 Failover_mode 设置,这种情况可能会导致 RGM 执行群集节点的硬重启。
因此,必须设计 Stop 方法让此方法一定要停止应用程序。如果采用其他方法无法终止应用程序,您甚至可能需要采用 SIGKILL 突然中止应用程序。
您还必须确保此方法能够及时停止应用程序,因为框架将 Stop_timeout 属性的终止视为停止失败,并因而将资源置入 STOP_FAILED 状态。
DSDL 实用程序 scds_pmf_stop() 在第一次尝试使用 SIGTERM 软停止应用程序时应当足以用于大多数应用程序。此函数随后将 SIGKILL 传递给进程。此函数假定应用程序是使用 scds_pmf_start() 在 PMF 下启动的。有关此实用程序的详细信息,请参见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() 函数取决于应用程序是否通过 Start 方法在 PMF 下启动。
Stop 方法的实现中没有使用 svc_validate() 方法,因为即使系统当前遇到问题,Stop 方法也应当尝试在此节点上停止应用程序。