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.
111 lines
2.4 KiB
111 lines
2.4 KiB
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() {
|
|
// 初始化日志
|
|
logger := util.NewProductionLogger()
|
|
defer logger.Sync()
|
|
|
|
// 读取配置文件
|
|
util.ReadConfig()
|
|
|
|
// 检查是否以守护进程方式运行
|
|
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.SysmonitorService))
|
|
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
|
|
}
|
|
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)
|
|
|
|
}
|
|
|