From 291942357bcbe339fcf8a30acd2ff4923eb0b6f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 1 Mar 2023 20:56:28 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=9C=A8=E7=99=BB=E5=BD=95=E6=97=B6?= =?UTF-8?q?=E4=B8=8D=E7=A6=81=E7=94=A8=E5=BF=AB=E9=80=9F=E7=BC=96=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/gocq/main.go | 13 +++++++++++-- global/signal_unix.go | 6 +++--- main.go | 4 +++- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/cmd/gocq/main.go b/cmd/gocq/main.go index bcedbbc..43798d3 100644 --- a/cmd/gocq/main.go +++ b/cmd/gocq/main.go @@ -71,8 +71,8 @@ func InitBase() { base.Init() } -// Main 启动主程序,必须在 InitBase 之后执行 -func Main() { +// PrepareData 准备 log, 缓存, 数据库, 必须在 InitBase 之后执行 +func PrepareData() { rotateOptions := []rotatelogs.Option{ rotatelogs.WithRotationTime(time.Hour * 24), } @@ -108,7 +108,10 @@ func Main() { if err := db.Open(); err != nil { log.Fatalf("打开数据库失败: %v", err) } +} +// LoginInteract 登录交互, 可能需要键盘输入, 必须在 InitBase, PrepareData 之后执行 +func LoginInteract() { var byteKey []byte arg := os.Args if len(arg) > 1 { @@ -336,7 +339,13 @@ func Main() { servers.Run(coolq.NewQQBot(cli)) log.Info("资源初始化完成, 开始处理信息.") log.Info("アトリは、高性能ですから!") +} +// WaitSignal 在新线程检查更新和网络并等待信号, 必须在 InitBase, PrepareData, LoginInteract 之后执行 +// +// - 直接返回: os.Interrupt, syscall.SIGTERM +// - dump stack: syscall.SIGQUIT, syscall.SIGUSR1 +func WaitSignal() { go func() { selfupdate.CheckUpdate() selfdiagnosis.NetworkDiagnosis(cli) diff --git a/global/signal_unix.go b/global/signal_unix.go index 96e623d..6ee65dc 100644 --- a/global/signal_unix.go +++ b/global/signal_unix.go @@ -14,9 +14,9 @@ import ( func SetupMainSignalHandler() <-chan struct{} { mainOnce.Do(func() { mainStopCh = make(chan struct{}) - mc := make(chan os.Signal, 3) + mc := make(chan os.Signal, 4) closeOnce := sync.Once{} - signal.Notify(mc, os.Interrupt, syscall.SIGTERM, syscall.SIGUSR1) + signal.Notify(mc, os.Interrupt, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGUSR1) go func() { for { switch <-mc { @@ -24,7 +24,7 @@ func SetupMainSignalHandler() <-chan struct{} { closeOnce.Do(func() { close(mainStopCh) }) - case syscall.SIGUSR1: + case syscall.SIGQUIT, syscall.SIGUSR1: dumpStack() } } diff --git a/main.go b/main.go index 90f5b20..b3dcdf1 100644 --- a/main.go +++ b/main.go @@ -15,8 +15,10 @@ import ( func main() { gocq.InitBase() + gocq.PrepareData() + gocq.LoginInteract() _ = terminal.DisableQuickEdit() _ = terminal.EnableVT100() - gocq.Main() + gocq.WaitSignal() _ = terminal.RestoreInputMode() }