- RunStartStop pre-start 脚本首先执行这个命令,首先监测heartbeat的/etc/ha.d/resource.d目录下是否有startstop脚本,我的机器ls /etc/ha.d/resource.d/|grep startstop 没有发现这个脚本,所以这步忽略。StartHA 启动HA,这里首先检查是否启用CRM模块,我这里没有启用,然后检查/etc/ha.d/haresources的合法性,然后初始化watchdog模块,这个需要根据ha.cf配置来选择是否加载生成wachdog,然后创建/var/run下面需要的目录,包括heartbeat和crm目录,heartbeat又有ccm crm dopd目录。下面检查haresouces是否存在,具体逻辑是如果/etc/ha.d/ipresouces存在并且haresouces不存在,重命名ipresouces为haresouces,然后StartSBD 这个主要是启动/sbin/sbd,我这里不存在这个东西,所以没有启动,具体sbd做什么我也不知道,暂时不考虑细节。最后是start_heartbeat,实际上是执行/usr/lib/heartbeat/heartbeat >& /dev/null,至此我们找到具体启动heartbeat程序的入口点了。
下面我们看一下heartbeat如何关闭的,当我们传递-k参数给程序的时候,其实程序主要发信号SIGTERM给master进程
点击(此处)折叠或打开
- do {
sleep(1);
continue;
}while (CL_KILL((pid_t)running_hb_pid, 0) >= 0);
点击(此处)折叠或打开
- id=Gmain_timeout_add_full(PRI_CHECKSIGS, config->heartbeat_ms
, Gmain_hb_signal_process_pending, NULL, NULL);
点击(此处)折叠或打开
- if (handlers&HB_SIG_TERM_SIG) {
hb_signal_term_action();
}
点击(此处)折叠或打开
- if (curproc->type == PROC_MST_CONTROL) {
hb_initiate_shutdown(FALSE);
}else{
cleanexit(SIGTERM);
}
点击(此处)折叠或打开
- send_local_status();
if (!quickshutdown && DoManageResources) {
/* THIS IS RESOURCE FIXME */
procinfo->giveup_resources = TRUE;
hb_giveup_resources();
/* Do something more drastic in 60 minutes */
Gmain_timeout_add(1000*60*60, EmergencyShutdown, NULL);
return;
}
点击(此处)折叠或打开
- if (!shut软件公司down_last_client_child(SIGTERM)) {
if (ANYDEBUG) {
cl_log(LOG_DEBUG
, "hb_mcp_final_shutdown()"
"- immediate completion.");
}
return hb_mcp_final_shutdown(p); /* phase 1 (no children) */
}