Go优雅重启与停止

信号

信号是UNIX、类UNIX,以及其他POSIX兼容的操作系统中进程间通信的一种有限制的方式。
它是一种异步的通知机制,用来提醒进程一个事件(硬件异常、程序执行异常、外部发出信号)已经发生。当一个信号发送给一个进程时,操作系统中断了进程正常的控制流程。此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则执行默认的处理函数。

查看信号

kill -l 查看

 ~ kill -l   
HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM 16 CHLD CONT STOP 
TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL 30 SYS

常用信号

命令 信号 含义
ctrl+c SIGINT 当用户键入终端中断字符(如:Ctrl + C)终端驱动程序将发送该信号给前台进程组。该信号默认行为是终止进程
ctrl+z SIGTSTP 作业控制的停止信号,当用户在键盘输入挂起字符(如:Ctrl+Z)时,将发送该信号给前台进程组,使其停止运行(该信号可以被处理和忽略)
ctrl+/ SIGQUIT 当用户在键盘键入退出字符(如Ctrl+\)时,该信号将发往前台进程组。默认情况下,该信号终止进程,并生成可用于调试的核心转储文件。当进程陷入无限循环或者不在响应,使用该信号很合适
SIGTERM 这是用来终止进程的标准信号,也是kill和killall命令所发送的默认信号。用户经常会使用kil -9显示向进程发送SIGKILL信号,然而这一做法通常是错误的。精心设计的应用程序应当为SIGTERM信号设置处理器程序,以便于其能够预先清理临时文件和释放资源,做到全身而退。发送SIGKILL信号可以杀掉某个进程,从而绕开了SIGTERM的信号处理程序。因此,总是应该首先尝试使用SIGTERM信号来终止进程,而把SIGKILL信号作为最后手段,去对付那些失控的进程
SIGKILL 此信号为必杀信号,处理器程序无法阻塞、忽略或者捕获,故而总能杀死进程(僵尸进程除外)
SIGHUP 当终端断开时,将发送该信号给终端控制进程。SIGHUP信号还可用于守护进程

重启流程

1.替换可执行文件或修改配置文件
2.发送信号量SIGHUP
3.拒绝新连接求情旧进程,并保证正在处理的连接正常
4.启动新的子进程
5.新的子进程开始处理新的请求
6.旧的进程处理完旧连接后正常退出

package main

import (
    "context"
    "fmt"
    "net/http"
    "os"
    "os/signal"
    "syscall"
    "time"
)

func main()  {
    s := http.Server{
        Addr:              ":8080",
        Handler:           nil,
        ReadTimeout:       60,
        WriteTimeout:      60,
        MaxHeaderBytes:    1 << 20,
    }
    go func() {
        if err := s.ListenAndServe(); err != nil && err != http.ErrServerClosed {
            fmt.Printf("http.ListenAndServe err:%v", err)
        }
    }()

    //监听信号
    quit := make(chan os.Signal)
    //监听 SIGINT 和 SIGTERM
    signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
    <- quit
    fmt.Printf("Server quiting....")

    //设置关闭后程序剩余多长时间处理原有的请求
    ctx, cancelFunc := context.WithTimeout(context.Background(), 5 * time.Second)
    defer cancelFunc()
    if err := s.Shutdown(ctx); err != nil {
        fmt.Printf("s.Shutdown(ctx) err:%v", err)
    }
    fmt.Printf("Server Shutdown....")
}

上面启动后,按ctrl+c可看到执行结果

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • 信号的概念 取决于进程的要求,内核对Signal信号有如下三种行为: 忽略信号 抓住这个信号并且对这个信号进行处理...
    无无吴阅读 205评论 0 0
  • 第10章 信号 10.1 引言 信号是软件中断。很多比较重要的应用程序都需处理信号。信号提 供了一种处理异步事件的...
    MachinePlay阅读 333评论 0 0
  • > cd命令 (change Directory) 说明:切换当前目录。这是一个非常基本,也是大家经常需要使用的命...
    神乐g阅读 312评论 0 0
  • 信号的机制 A给B发送信号,B收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处...
    Sharkchilli阅读 403评论 0 0
  • shutdown-hook 建议加上shutdown的钩子如果程序出现了内存溢出crash 则现在代码是没有任何保...
    landon30阅读 2,989评论 0 0