gohttp/main.go

56 lines
1.2 KiB
Go
Raw Normal View History

2023-12-07 00:22:53 +08:00
package main
import (
2023-12-07 22:42:27 +08:00
"os"
"os/signal"
"syscall"
2023-12-10 19:26:09 +08:00
"git.pyer.club/kingecg/godaemon"
2023-12-13 10:59:47 +08:00
"git.pyer.club/kingecg/gologger"
2023-12-07 00:22:53 +08:00
)
2025-02-18 00:54:50 +08:00
// main 函数是程序的入口点
2023-12-07 00:22:53 +08:00
func main() {
2025-02-18 00:54:50 +08:00
// 加载配置文件
2023-12-13 17:59:14 +08:00
LoadConfig()
2025-02-18 00:54:50 +08:00
// 获取日志记录器
2023-12-13 10:59:47 +08:00
l := gologger.GetLogger("main")
2025-02-18 00:54:50 +08:00
// 使用 defer 和 recover 捕获 panic确保程序不会因未处理的异常而崩溃
2023-12-13 10:59:47 +08:00
defer func() {
if err := recover(); err != nil {
l.Error("panic", err)
}
}()
2025-02-18 00:54:50 +08:00
// 创建守护进程实例
2023-12-10 19:26:09 +08:00
daemon := godaemon.NewGoDaemon(start, stop)
2025-02-18 00:54:50 +08:00
// 启动守护进程
2023-12-10 19:26:09 +08:00
daemon.Start()
}
2025-02-18 00:54:50 +08:00
// waiter 用于接收系统信号
2023-12-13 09:22:05 +08:00
var waiter chan os.Signal
2025-02-18 00:54:50 +08:00
// start 函数是守护进程启动时执行的函数
2023-12-10 19:26:09 +08:00
func start(g *godaemon.GoDaemon) {
2025-02-18 00:54:50 +08:00
// 创建缓冲通道用于接收系统信号
waiter = make(chan os.Signal, 1)
// 监听 SIGTERM 和 SIGINT 信号
2023-12-07 22:42:27 +08:00
signal.Notify(waiter, syscall.SIGTERM, syscall.SIGINT)
2025-02-18 00:54:50 +08:00
// 创建 HTTP 服务器实例
2023-12-10 19:26:09 +08:00
httpd := &GoHttp{}
2025-02-18 00:54:50 +08:00
// 启动 HTTP 服务器
2023-12-10 19:26:09 +08:00
httpd.Start()
2025-02-18 00:54:50 +08:00
// 阻塞等待信号
2023-12-07 22:42:27 +08:00
<-waiter
2025-02-18 00:54:50 +08:00
// 记录退出日志
2023-12-13 09:22:05 +08:00
httpd.logger.Info("Exit")
2023-12-10 19:26:09 +08:00
}
2023-12-08 22:02:36 +08:00
2025-02-18 00:54:50 +08:00
// stop 函数是守护进程停止时执行的函数
2023-12-10 19:26:09 +08:00
func stop(g *godaemon.GoDaemon) {
2025-02-18 00:54:50 +08:00
// 发送 SIGTERM 信号给当前进程
2023-12-10 19:26:09 +08:00
g.Running.Process.Signal(syscall.SIGTERM)
2025-02-18 00:54:50 +08:00
}