服务器优雅退出和程序崩溃后,如何构建完善的善后流程机制?

摘要:程序异常后是带病继续运行还是结束进程? 从安全的角度来说应该结束进程,那么异常后如何善后?此处省略信号监听过程...操作系统触发的奔溃异常信号函数, on_sig(sig, is_crash) {1、关闭所有
程序异常后是带病继续运行还是结束进程? 从安全的角度来说应该结束进程,那么异常后如何善后? // 此处省略信号监听过程 // ... // 操作系统触发的奔溃异常信号函数, 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步也可能会超时,可以根据系统实际负荷延长等待时间。