服务器优雅退出和程序崩溃后的善后流程

程序异常后是带病继续运行还是结束进程?
从安全的角度来说应该结束进程,那么异常后如何善后?

// 此处省略信号监听过程
// ...
// 操作系统触发的奔溃异常信号函数,
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步也可能会超时,可以根据系统实际负荷延长等待时间。

posted @ 2025-05-02 18:12  码客-ygluu  阅读(38)  评论(0)    收藏  举报