服务器优雅退出和程序崩溃后的善后流程
程序异常后是带病继续运行还是结束进程?
从安全的角度来说应该结束进程,那么异常后如何善后?
// 此处省略信号监听过程
// ...
// 操作系统触发的奔溃异常信号函数,
on_sig(sig, is_crash)
{
// 1、关闭所有定时器
close_timers();
// 2、关闭所有socket监听
close_listens();
// 3、关闭网关连接本服务的socket
close_gate_sockets();
// 4、停止服务间的数据接收
close_readers();
// 5、等待服务间通讯数据发送完毕
// 可能有数据需要持久化
wait_datas_writed(time_long);
// 6、关闭所有socket
close_sockets();
// 7、等待所有非日志线程结束
wait_threads_stoped(time_long);
// 8、释放非日志模块申请的所有内存资源
free_mem_resources();
// 9、关闭日志模块
close_log_module();
// 10、重新抛出信号,将控制权交还给操作系统,
// 让操作系统生成dump文件
if (is_crash)
{
signal(sig, SIG_DFL);
raise(sig);
}
}
优雅退出流程:1、2、3、4、5、6、7、8、9
奔溃退出流程:1、2、3、4、5、6、7、8、9、10
日志模块存在的规则:
日志模块先女娲补天而存在,后世界末日而消失!
模块化框架下实现优雅退出非常难,但优雅退出非常重要:
可以利用工具发现内存泄漏
注:
1、崩溃情况下,第5、7步可能会超时,这个在所难免。
2、如果未发送数据太多,无论崩溃或非崩溃情况下,第5、7步也可能会超时,可以根据系统实际负荷延长等待时间。

浙公网安备 33010602011771号