keepalive进程的开启
Atlas调用chassis_unix_proc_keepalive函数来keep process alive。
调用fork创建子进程,其中子进程直接返回,处理接下来的任务,父进程将接收到的SIGINT、SIGTERM、SIGHUP、SIGUSR1和SIGUSR2信号发送给子进程进行处理,若系统支持wait4则调用wait4等待子进程结束,否则调用waitpid。
若子进程退出,对pid_file调用unlink(这个文件保存了子进程的pid)。检查子进程的退出原因,若是调用exit退出的,写入日志,同时父进程返回1,这将会导致父进程的结束;若是因为信号而退出,写入日志,同时sleep 2秒后重启子进程。
若是出的其的错误,则写入日志,返回-1结束。
这样就以keepalive的形式启动了整个程序,子进程负责对外提供服务,父进程则监控子进程,保证子进程一直都处于活跃状态,若子进程终止,则重新创建子进程,以保证服务的不中断。
int chassis_unix_proc_keepalive(int *child_exit_status, const char *pid_file) {
#ifdef _WIN32
g_assert_not_reached();
return 0;
#else
int nprocs = 0;
pid_t child_pid = -1;
/* we ignore SIGINT and SIGTERM and just let it be forwarded to the child instead
* as we want