代码拉取完成,页面将自动刷新
// linux 系统下包含优雅退出和平滑重启功能
// 平滑重启核心实现介绍:https://grisha.org/blog/2014/06/03/graceful-restart-in-golang/
// +build linux
package app
import (
"context"
"fmt"
"gitee.com/zhucheer/orange/cfg"
"net"
"os"
"os/exec"
"os/signal"
"syscall"
)
func init() {
// 注册平滑重启参数
cfg.SetBoolFlag("grace", false, "graceful restart app flag")
}
// listenShutDownSign 监听退出信号
func listenShutDownSign(ctx context.Context, orangeSrv *OrangeServer) {
exitSig := []os.Signal{
syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGUSR1,
}
appsign := make(chan os.Signal, 1)
signal.Notify(appsign, exitSig...)
select {
case signItem := <-appsign:
shutdownLinuxDo(ctx, orangeSrv, signItem)
}
signal.Stop(appsign)
// http服务关闭后等待业务处理完成后关闭应用
exitWaitHandler.wg.Wait()
}
// shutdownLinuxDo
func shutdownLinuxDo(ctx context.Context, orangeSrv *OrangeServer, signType os.Signal) {
fmt.Println(fmt.Sprintf("[ORANGE] \033[0;33m shutdown sign:%v \033[0m ", signType.String()))
switch signType {
case syscall.SIGUSR1:
fmt.Println("[ORANGE] \033[0;33m app grace reload \033[0m ")
httpListener := orangeSrv.GetListener()
forkSocket(httpListener)
default:
fmt.Println("[ORANGE] \033[0;33m shutdown do \033[0m ")
}
shutdownDo(ctx, orangeSrv)
}
func forkSocket(tcpListener *net.TCPListener) error {
f, err := tcpListener.File()
if err != nil {
return err
}
args := []string{"-grace"}
for k, item := range os.Args {
if k == 0 {
continue
}
args = append(args, item)
}
cmd := exec.Command(os.Args[0], args...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
// put socket FD at the first entry
cmd.ExtraFiles = []*os.File{f}
return cmd.Start()
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。