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
|
|
|
|
}
|