package main import ( "net/http" _ "net/http/pprof" "os" "os/exec" "os/signal" "runtime" "syscall" "time" jsoniter "github.com/json-iterator/go" "github.com/sanbornm/go-selfupdate/selfupdate" "github.com/sirupsen/logrus" "github.com/thinkgos/timing/v3" "lc/common/util" ) var json = jsoniter.ConfigCompatibleWithStandardLibrary var gopool *util.Pool var IDGen util.IdWorker var version = "1.4.1" var appname = "ipole" func Stat(args ...interface{}) interface{} { lastGC := time.Now() for { if time.Now().Sub(lastGC) > time.Minute { timing.Count() runtime.GC() lastGC = time.Now() } time.Sleep(time.Second) } return 0 } func GetNextUint64() uint64 { u64, err := IDGen.NextId() if err != nil { logrus.Errorf("IDGen.NextId发生错误:%s", err.Error()) u64 = util.MlNow().Unix() } return uint64(u64) } func EnableUpdate() { var updater = &selfupdate.Updater{ CurrentVersion: version, ApiURL: "http://106.52.134.22:8180/", BinURL: "http://106.52.134.22:8180/", DiffURL: "http://106.52.134.22:8180/", Dir: "update/", CmdName: appname, // app name } if updater != nil { go updater.BackgroundRun() } } // WatchGoforever 每十分钟查看一次goforever是否启动 hxz func WatchGoforever(args ...interface{}) interface{} { for { time.Sleep(1 * time.Minute) isRun, err := CheckProRunning("goforever") if err != nil { logrus.Errorf("检查goforever命令失败:%s", err.Error()) } else { if !isRun { //这里重启goforever //err := exec.Command("/usr/app/goforever/goforever", "&").Run() //err := exec.Command("/bin/sh", "-c", "/usr/app/goforever/goforever ./goforever &").Run() err := exec.Command("/bin/sh", "-c", "/usr/app/goforever ./goforever &").Run() if err != nil { logrus.Errorf("重启goforever出错: %s", err.Error()) } else { logrus.Info("重启goforever成功,当前时间:", util.MlNow().String()) } } else { logrus.Info("goforever进程正在运行:", util.MlNow().String()) } } } } // SyncTime 每半小时同步一次时间 func SyncTime(args ...interface{}) interface{} { for { err := exec.Command("ntpclient", "-h", "106.52.134.22", "-s").Run() if err != nil { logrus.Errorf("时间同步失败:%s", err.Error()) } else { logrus.Info("时间同步成功,当前时间:", util.MlNow().String()) } time.Sleep(30 * time.Minute) } } func SignalProcess(args ...interface{}) interface{} { for { ch := make(chan os.Signal) signal.Notify(ch, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGKILL, syscall.SIGQUIT) logrus.Info("检测到退出信号:", <-ch) } return 0 } // func HttpProcess(w http.ResponseWriter, r *http.Request) { // if GetMonitorStatus().GetMonitorRunStatus() { // fmt.Fprintf(w, "1") // } else { // fmt.Fprintf(w, "0") // } // } func main() { runtime.GOMAXPROCS(runtime.NumCPU() * 2) util.InitLogrus("release") go func() { logrus.Infoln(http.ListenAndServe(":9999", nil)) }() logrus.Infof("当前程序版本:%s", appname+" "+version) if err := loadAppConfig(); err != nil { logrus.Errorf("loadAppConfig错误:%s", err.Error()) return } //升级检查 if appConfig.Upgrade { EnableUpdate() } if err := loadSerialConfig(); err != nil { logrus.Errorf("loadAppConfig错误:%s", err.Error()) return } IDGen.InitIdWorker(1000, 1) GetMQTTMgr() InitRedis(&util.RedisConfig{Redis_Address: appConfig.Edge.Redis.Server, Redis_Password: appConfig.Edge.Redis.Password}) defer UninitRedis() InitCloudMqttSubscribeTopics() //打开串口 GetSerialMgr().AddSerialPorts(serialConfig.Serial) //创建设备并启动数据处理流程 for k := range serialConfig.Serial { if devinfos, err := LoadDev(k); err == nil { GetDeviceMgr().AddDevices(devinfos) } } gopool = util.NewPool(10) gopool.Add(SyncTime, 0) // gopool.Add(WatchGoforever, 0) // gopool.Add(SignalProcess, 8) gopool.Add(WatchDevConfig, 1) gopool.Add(WatchModelConfig, 2) gopool.Add(WatchConfConfig, 3) gopool.Add(GetMQTTMgr().MQTTMessageHandle, 4) gopool.Add(GetMQTTMgr().MQTTConnectMgr, 5) gopool.Add(Stat, 6) gopool.Add(RadarReceive, 7) gopool.Run() gopool.Wait() }