支持优雅退出

This commit is contained in:
刘祥超
2020-10-28 11:19:06 +08:00
parent 0be8b78201
commit 1d6b0559e6
19 changed files with 238 additions and 15 deletions

View File

@@ -5,8 +5,10 @@ import (
"errors"
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeNode/internal/apps"
"github.com/TeaOSLab/EdgeNode/internal/caches"
"github.com/TeaOSLab/EdgeNode/internal/configs"
"github.com/TeaOSLab/EdgeNode/internal/events"
"github.com/TeaOSLab/EdgeNode/internal/logs"
"github.com/TeaOSLab/EdgeNode/internal/rpc"
"github.com/TeaOSLab/EdgeNode/internal/utils"
@@ -16,7 +18,9 @@ import (
"io/ioutil"
"net"
"os"
"os/signal"
"runtime"
"syscall"
"time"
)
@@ -49,6 +53,9 @@ func (this *Node) Test() error {
// 启动
func (this *Node) Start() {
// 处理信号
this.listenSignals()
// 本地Sock
err := this.listenSock()
if err != nil {
@@ -92,12 +99,46 @@ func (this *Node) Start() {
err = sharedListenerManager.Start(nodeConfig)
if err != nil {
logs.Error("NODE", "start failed: "+err.Error())
return
}
// 写入PID
err = apps.WritePid()
if err != nil {
logs.Error("NODE", "write pid failed: "+err.Error())
return
}
// hold住进程
select {}
}
// 处理信号
func (this *Node) listenSignals() {
signals := make(chan os.Signal)
signal.Notify(signals, syscall.SIGQUIT)
go func() {
for s := range signals {
switch s {
case syscall.SIGQUIT:
events.Notify(events.EventQuit)
// 监控连接数如果连接数为0则退出进程
go func() {
for {
countActiveConnections := sharedListenerManager.TotalActiveConnections()
if countActiveConnections <= 0 {
os.Exit(0)
return
}
time.Sleep(1 * time.Second)
}
}()
}
}
}()
}
// 读取API配置
func (this *Node) syncConfig(isFirstTime bool) error {
// 检查api.yaml是否存在
@@ -180,6 +221,10 @@ func (this *Node) syncConfig(isFirstTime bool) error {
func (this *Node) startSyncTimer() {
// TODO 这个时间间隔可以自行设置
ticker := time.NewTicker(60 * time.Second)
events.On(events.EventQuit, func() {
logs.Println("NODE", "quit sync timer")
ticker.Stop()
})
go func() {
for {
select {
@@ -272,6 +317,10 @@ func (this *Node) listenSock() error {
if err != nil {
return err
}
events.On(events.EventQuit, func() {
logs.Println("NODE", "quit unix sock")
_ = listener.Close()
})
go func() {
for {