自动更新管控端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

133 lines
2.9 KiB

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