当前位置: 首页 > news >正文

go资深之路笔记(五)用系统信号实现优雅关机

作用:程序结束的时候可能需要一定的时间去处理,比如mysql连接,rediss处理等,这个时候我们可以通过特定系统信号来通知go程序,go程序这边会监听覆盖这些系统信号,使得go程序可以自己控制关闭时间。
核心代码

quit := make(chan os.Signal, 1)	// 创建一个系统信号chan
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)	// 注册信号
<-quit // 阻塞,直到收到信号

实现代码 main.go:

package mainimport ("context""log""net/http""os""os/signal""syscall""time"
)func main() {// 创建一个自定义的 ServerMux 和 Servermux := http.NewServeMux()mux.HandleFunc("/slow", func(w http.ResponseWriter, r *http.Request) {time.Sleep(5 * time.Second) // 模拟一个长请求w.Write([]byte("All done!\n"))})srv := &http.Server{Addr:    ":8081",Handler: mux,}// 在一个单独的 goroutine 中启动服务器go func() {if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {log.Fatalf("ListenAndServe error: %v", err)}log.Println("Server stopped")}()// 创建一个通道来接收操作系统信号quit := make(chan os.Signal, 1)// 监听 SIGINT (Ctrl+C) 和 SIGTERM (docker stop, k8s termination)signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)<-quit // 阻塞,直到收到信号log.Println("Shutting down server...")// 创建一个具有超时的上下文,用于优雅关机// 给正在处理的请求 10 秒时间来完成ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)defer cancel()// 开始优雅关机:停止接受新请求,阻塞直到所有现有请求处理完毕或超时if err := srv.Shutdown(ctx); err != nil {log.Fatalf("Server forced to shutdown: %v", err)}// 此处可以安全地关闭数据库、缓存等连接// db.Close()// redisConn.Close()log.Println("Server exited gracefully")
}

执行:

go run main.go		// go test 会直接关闭,似乎没有正确覆盖。

执行成功后,访问:
127.0.0.1:8081
然后用ctrl+C快速关闭执行的程序,就会得到打印:
在这里插入图片描述

ps:如果不监听信号syscall.SIGINT直接ctrl+C,会得到:
在这里插入图片描述
常见系统信号:
不可捕抓信号:
SIGKILL(9) 强制关闭 对应Linux命令: kill -9 pid
SIGSTOP(19)强制暂停 对应Linux命令: kill -19 pid
SIGCONT(18) 恢复会暂停的进程(包括 SIGSTOP和SIGSTP)
可捕信号:
SIGINT 关闭程序 对应linux命令 ctrl+C
SIGTERM 关闭终端 对应linux命令 kill pid
SIGUSR1 自定义信号 对应linux 命令 kill -10 pid
SIGQUIT 终止并生成 core dump 对应linux命令 kill -3 pid 或者 ctrl +
SIGSTP 终端暂停 对应Linux命令: kill -20 pid 或者 ctrl +z(这个会放入后台)

http://www.dtcms.com/a/390651.html

相关文章:

  • C++实战㉔】解锁C++ STL魔法:list与deque实战秘籍
  • Linux 系统指令——助力信奥初赛
  • LVS详解:构建高性能Linux负载均衡集群
  • 【Linux网络编程】网络层协议-----IP协议
  • 电池AH的定义与WH关系
  • 谙流 ASK 技术解析(四):负载均衡引擎
  • 乾元通渠道商中标国家华中区域应急救援中心应急救援装备采购项目
  • 网络原理补充——NAT/NAPT、代理服务、内网穿透、交换机
  • 深入 HTTP 协议:剖析 1688 商品详情 API 的请求构造与签名机制
  • 共用体union和大小端模式
  • 2022年下半年 系统架构设计师 案例分析
  • LeetCode 面试经典 150_哈希表_有效的字母异位词(42_242_C++_简单)
  • go webrtc - 3 工程演示
  • JVM(五)-- 执行引擎
  • 微算法科技(NASDAQ:MLGO)量子架构搜索技术:突破变分量子算法性能瓶颈,实现量子计算的鲁棒优化
  • 海亮科技亮相第十一届亚教展,“教育 + AI”赋能县域教育振兴
  • JMeter的配置元件
  • Charles与Postman、JMeter结合使用教程:高效接口调试与性能测试方案
  • 【Haddop】Hive的离线分析与Sqoop的数据集成
  • 嵌入式 Linux 基础入门笔记(1)
  • Starlink 2.0与3GPP NTN技术对比分析:颠覆性优势与产业格局重构
  • 鸿蒙Next用户文件管理全解析:安全、高效、跨设备的未来体验
  • 简形电力JX2202 智能测试系统:重构新能源电力检测效率标准
  • AI识别视频中动物与人物的技术深度解析
  • iOS 上架完整流程指南 苹果应用发布步骤、App Store 上架流程
  • MySQL-CRUD 操作及常用查询语法详解
  • 玳瑁的嵌入式日记---0919(ARM)
  • Objective-C —— APIs declaration 自定义
  • 【XTDrone】笔记5:control文件详解
  • 抓包的那些事,抓包的原理、常见场景、工具比较与实战排查流程(抓包步骤、iOS 抓包、HTTPS 抓包技巧)