package main import ( "fmt" "net" "net/rpc" "net/rpc/jsonrpc" "os" "os/signal" "scagnet/config" "scagnet/core" "scagnet/util" "syscall" "go.uber.org/zap" ) // 输入-d 参数,以守护进程方式运行 func isDaemon() bool { for _, arg := range os.Args { if arg == "-d" { fmt.Println("以守护进程方式运行") return true } } fmt.Println("以非守护进程方式运行") return false } // 优雅退出(退出信号) func waitElegantExit(signalChan chan os.Signal) { for i := range signalChan { switch i { case syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT: // 这里做一些清理操作或者输出相关说明,比如 断开数据库连接 fmt.Println("receive exit signal ", i.String(), ",exit...") os.Exit(0) } } } func main() { // fmt.Println("JSON RPC服务端") // 初始化日志 logger := util.NewProductionLogger() defer logger.Sync() logger.Info("JSON RPC服务端启动") // 检查是否以守护进程方式运行 if isDaemon() { // 以守护进程方式运行 jrpc := new(core.FileRpc) rpc.Register(jrpc) // sport := fmt.Sprintf(":%v", config.G.Port) tcpAddr, err := net.ResolveTCPAddr("tcp", sport) if err != nil { logger.Error("ResolveTCPAddr failed", zap.Error(err)) return } // 监听 listenr, err := net.ListenTCP("tcp", tcpAddr) if err != nil { logger.Error("ListenTCP failed", zap.Error(err)) return } for { conn, err := listenr.AcceptTCP() if err != nil { logger.Error("AcceptTCP failed", zap.Error(err)) continue } jsonrpc.ServeConn(conn) } } // 优雅退出 // quit := make(chan os.Signal) // signal.Notify(quit, os.Interrupt, os.Kill) // v := <-quit // fmt.Println("退出信号:", v) c := make(chan os.Signal) // SIGHUP: terminal closed // SIGINT: Ctrl+C // SIGTERM: program exit // SIGQUIT: Ctrl+/ signal.Notify(c, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) // 阻塞,直到接受到退出信号,才停止进程 waitElegantExit(c) }