main.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. package main
  2. import (
  3. "net/http"
  4. _ "net/http/pprof"
  5. "os"
  6. "os/exec"
  7. "os/signal"
  8. "runtime"
  9. "syscall"
  10. "time"
  11. jsoniter "github.com/json-iterator/go"
  12. "github.com/sanbornm/go-selfupdate/selfupdate"
  13. "github.com/sirupsen/logrus"
  14. "github.com/thinkgos/timing/v3"
  15. "lc/common/util"
  16. )
  17. var json = jsoniter.ConfigCompatibleWithStandardLibrary
  18. var gopool *util.Pool
  19. var IDGen util.IdWorker
  20. var version = "1.4.1"
  21. var appname = "ipole"
  22. func Stat(args ...interface{}) interface{} {
  23. lastGC := time.Now()
  24. for {
  25. if time.Now().Sub(lastGC) > time.Minute {
  26. timing.Count()
  27. runtime.GC()
  28. lastGC = time.Now()
  29. }
  30. time.Sleep(time.Second)
  31. }
  32. return 0
  33. }
  34. func GetNextUint64() uint64 {
  35. u64, err := IDGen.NextId()
  36. if err != nil {
  37. logrus.Errorf("IDGen.NextId发生错误:%s", err.Error())
  38. u64 = util.MlNow().Unix()
  39. }
  40. return uint64(u64)
  41. }
  42. func EnableUpdate() {
  43. var updater = &selfupdate.Updater{
  44. CurrentVersion: version,
  45. ApiURL: "http://106.52.134.22:8180/",
  46. BinURL: "http://106.52.134.22:8180/",
  47. DiffURL: "http://106.52.134.22:8180/",
  48. Dir: "update/",
  49. CmdName: appname, // app name
  50. }
  51. if updater != nil {
  52. go updater.BackgroundRun()
  53. }
  54. }
  55. // WatchGoforever 每十分钟查看一次goforever是否启动 hxz
  56. func WatchGoforever(args ...interface{}) interface{} {
  57. for {
  58. time.Sleep(1 * time.Minute)
  59. isRun, err := CheckProRunning("goforever")
  60. if err != nil {
  61. logrus.Errorf("检查goforever命令失败:%s", err.Error())
  62. } else {
  63. if !isRun {
  64. //这里重启goforever
  65. //err := exec.Command("/usr/app/goforever/goforever", "&").Run()
  66. //err := exec.Command("/bin/sh", "-c", "/usr/app/goforever/goforever ./goforever &").Run()
  67. err := exec.Command("/bin/sh", "-c", "/usr/app/goforever ./goforever &").Run()
  68. if err != nil {
  69. logrus.Errorf("重启goforever出错: %s", err.Error())
  70. } else {
  71. logrus.Info("重启goforever成功,当前时间:", util.MlNow().String())
  72. }
  73. } else {
  74. logrus.Info("goforever进程正在运行:", util.MlNow().String())
  75. }
  76. }
  77. }
  78. }
  79. // SyncTime 每半小时同步一次时间
  80. func SyncTime(args ...interface{}) interface{} {
  81. for {
  82. err := exec.Command("ntpclient", "-h", "106.52.134.22", "-s").Run()
  83. if err != nil {
  84. logrus.Errorf("时间同步失败:%s", err.Error())
  85. } else {
  86. logrus.Info("时间同步成功,当前时间:", util.MlNow().String())
  87. }
  88. time.Sleep(30 * time.Minute)
  89. }
  90. }
  91. func SignalProcess(args ...interface{}) interface{} {
  92. for {
  93. ch := make(chan os.Signal)
  94. signal.Notify(ch, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGKILL, syscall.SIGQUIT)
  95. logrus.Info("检测到退出信号:", <-ch)
  96. }
  97. return 0
  98. }
  99. // func HttpProcess(w http.ResponseWriter, r *http.Request) {
  100. // if GetMonitorStatus().GetMonitorRunStatus() {
  101. // fmt.Fprintf(w, "1")
  102. // } else {
  103. // fmt.Fprintf(w, "0")
  104. // }
  105. // }
  106. func main() {
  107. runtime.GOMAXPROCS(runtime.NumCPU() * 2)
  108. util.InitLogrus("release")
  109. go func() {
  110. logrus.Infoln(http.ListenAndServe(":9999", nil))
  111. }()
  112. logrus.Infof("当前程序版本:%s", appname+" "+version)
  113. if err := loadAppConfig(); err != nil {
  114. logrus.Errorf("loadAppConfig错误:%s", err.Error())
  115. return
  116. }
  117. //升级检查
  118. if appConfig.Upgrade {
  119. EnableUpdate()
  120. }
  121. if err := loadSerialConfig(); err != nil {
  122. logrus.Errorf("loadAppConfig错误:%s", err.Error())
  123. return
  124. }
  125. IDGen.InitIdWorker(1000, 1)
  126. GetMQTTMgr()
  127. InitRedis(&util.RedisConfig{Redis_Address: appConfig.Edge.Redis.Server, Redis_Password: appConfig.Edge.Redis.Password})
  128. defer UninitRedis()
  129. InitCloudMqttSubscribeTopics()
  130. //打开串口
  131. GetSerialMgr().AddSerialPorts(serialConfig.Serial)
  132. //创建设备并启动数据处理流程
  133. for k := range serialConfig.Serial {
  134. if devinfos, err := LoadDev(k); err == nil {
  135. GetDeviceMgr().AddDevices(devinfos)
  136. }
  137. }
  138. gopool = util.NewPool(10)
  139. gopool.Add(SyncTime, 0)
  140. // gopool.Add(WatchGoforever, 0)
  141. // gopool.Add(SignalProcess, 8)
  142. gopool.Add(WatchDevConfig, 1)
  143. gopool.Add(WatchModelConfig, 2)
  144. gopool.Add(WatchConfConfig, 3)
  145. gopool.Add(GetMQTTMgr().MQTTMessageHandle, 4)
  146. gopool.Add(GetMQTTMgr().MQTTConnectMgr, 5)
  147. gopool.Add(Stat, 6)
  148. gopool.Add(RadarReceive, 7)
  149. gopool.Run()
  150. gopool.Wait()
  151. }