package main import ( "fmt" "net" "net/rpc" "net/rpc/jsonrpc" "os" "os/signal" "scagent/config" "scagent/core" "scagent/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() { // 初始化日志 logger := util.NewProductionLogger() defer logger.Sync() // 读取配置文件 util.ReadConfig() // zip 存放位置 tgdir, err := os.Getwd() if err != nil { logger.Error("Getwd failed", zap.Error(err)) } config.G.FilePath = tgdir // 检查是否以守护进程方式运行 if isDaemon() { // 以守护进程方式运行 jrpc := new(core.FileRpcService) // 注册服务名 err := rpc.RegisterName("FileRpcService", jrpc) if err != nil { logger.Error("Register failed", zap.Error(err)) return } // 注册服务信息 err = rpc.RegisterName("SysmonitorService", new(core.SysMonitor)) if err != nil { logger.Error("Register failed", zap.Error(err)) return } // 文件功能,上传下载压缩 err = rpc.RegisterName("FileService", new(core.FileService)) if err != nil { logger.Error("Register failed", zap.Error(err)) return } // 文件上传的服务 err = rpc.RegisterName("UpFileService", new(core.UpFileService)) if err != nil { logger.Error("Register failed", zap.Error(err)) return } // sport := fmt.Sprintf(":%v", config.G.Port) logger.Info("Listen port", zap.String("port", sport)) 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 } defer listenr.Close() for { conn, err := listenr.Accept() if err != nil { logger.Error("AcceptTCP failed", zap.Error(err)) continue } go jsonrpc.ServeConn(conn) } } os.Exit(0) // 优雅退出 // 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) }