Go 程序常用 kill 信号及捕获
目录
Go 程序常用 kill 信号及捕获, MacOS 下验证,基于 go1.17.7
。
版权声明:本文为博主 xwi88 的原创文章,遵循 CC BY-NC 4.0 版权协议,禁止商用,转载请注明出处,欢迎关注 https://github.com/xwi88
常用信号
|
|
Go Code
|
|
需要更便捷处理可以引入: signal
kill 测试
宿主机上执行
kill
程序停止app
运行,按照app
运行环境分为:宿主环境,docker 环境
宿主环境
kill -<signal_number | signal_name> <pid>
技巧
linux/unix kill 默认
signal_number=15
TERM经测试: 可正常捕获且返回 0 的 signal:
1, 2, 3, 6, 14, 15
,30, 31
HUP, INI, QUIT, ABRT, ALRM, TERM, USR1, USR2
- 不区分大小写
- 可附加前缀
SIG
,同样不区分大小写
docker 环境
docker kill -<signal_number | signal_name> <container_id>
技巧
docker kill 默认
signal_number=9
KILL经测试: 可正常捕获且返回 0 的 signal:
1, 2, 3, 6, 14, 15
,10, 12
- 经测试,docker kill 时 传入
10, 12
才可被识别为USR1, USR2
- 原因暂时不明,不建议使用
USR1
,USR2
- 经测试,docker kill 时 传入
HUP, INI, QUIT, ABRT, ALRM, TERM, USR1, USR2
- 不区分大小写
- 可附加前缀
SIG
,同样不区分大小写
结论
经过以上测试,常用可正常捕获无差异性且返回 0 的 signal:
1, 2, 3, 6, 14, 15
根据信号表示意义,我们推荐程序使用
- 2 SIGINT 触发:
CTRL+C
或kill -2
- 15 SIGTERM
优雅停止服务
- 执行 kill 发送信号
-15/-TERM/-SIGTERM
- 程序捕获信号后节点摘除, 释放资源,停止程序
- 间隔指定时间后,检测是否停止成功,未成功可根据设定策略执行
kill -9/-KILL/-SIGKILL
k8s 优雅停止服务
- 节点摘除
preStop hook
可设置延迟时间,用于处理进入流量- 发送 kill 信号
-15/-TERM/-SIGTERM
- 程序捕获信号释放资源,停止程序
- 超时强制关闭处理
kill -9/-KILL/-SIGKILL
- 默认 30s
- pod:
terminationGracePeriodSecond
修改
Docker-compose kill issue
- 当前
Docker Compose version 2.2.2
docker-compose
启动 CTRL+C
退出失败,强制退出: CTRL+\