Monitor_stop 方法将使用 pmfadm -q 查看探测程序是否正在运行,如果正在运行,将使用 pmfadm -s 停止该程序。 如果探测程序已停止,该方法仍将成功退出,这可以确保该方法的幂等性。
# See if the monitor is running, and if so, kill it. if pmfadm -q $PMF_TAG; then pmfadm -s $PMF_TAG KILL if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.err \ -t [$SYSLOG_TAG] \ "${ARGV0} Could not stop monitor for resource " \ $RESOURCE_NAME exit 1 else # could successfully stop the monitor. Log a message. logger -p ${SYSLOG_FACILITY}.err \ -t [$SYSLOG_TAG] \ "${ARGV0} Monitor for resource " $RESOURCE_NAME \ " successfully stopped" fi fi exit 0 |
请务必通过 pmfadm 使用 KILL 信号停止该探测程序,而不要使用可屏蔽信号,例如 TERM。 否则,Monitor_stop 方法将无限期地挂起,最终将会超时。 导致此问题的原因是必要时 PROBE 方法会调用 scha_control(),以重启或故障切换数据服务。 作为使数据服务脱机进程的一部分,当 scha_control() 调用 Monitor_stop 时,如果 Monitor_stop 使用可屏蔽信号,它将挂起,等待 scha_control() 的完成,且 scha_control() 也将挂起,等待 Monitor_stop 的完成。