main.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  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/thinkgos/timing/v3"
  14. "lc/common/util"
  15. )
  16. var json = jsoniter.ConfigCompatibleWithStandardLibrary
  17. var gopool *util.Pool
  18. var IDGen util.IdWorker
  19. var version = "1.4.1"
  20. var appname = "ipole"
  21. func Stat(args ...interface{}) interface{} {
  22. lastGC := time.Now()
  23. for {
  24. if time.Now().Sub(lastGC) > time.Minute {
  25. timing.Count()
  26. runtime.GC()
  27. lastGC = time.Now()
  28. }
  29. time.Sleep(time.Second)
  30. }
  31. return 0
  32. }
  33. func GetNextUint64() uint64 {
  34. u64, err := IDGen.NextId()
  35. if err != nil {
  36. util.GetTagLog().Errorf("sys", "IDGen.NextId发生错误:%s", err.Error())
  37. u64 = util.MlNow().Unix()
  38. }
  39. return uint64(u64)
  40. }
  41. func EnableUpdate() {
  42. var updater = &selfupdate.Updater{
  43. CurrentVersion: version,
  44. ApiURL: appConfig.UpdateUrl,
  45. BinURL: appConfig.UpdateUrl,
  46. DiffURL: appConfig.UpdateUrl,
  47. Dir: "update/",
  48. CmdName: appname, // app name
  49. }
  50. if updater != nil {
  51. go updater.BackgroundRun()
  52. }
  53. }
  54. // WatchGoforever 每十分钟查看一次goforever是否启动 hxz
  55. func WatchGoforever(args ...interface{}) interface{} {
  56. for {
  57. time.Sleep(1 * time.Minute)
  58. isRun, err := CheckProRunning("goforever")
  59. if err != nil {
  60. util.GetTagLog().Errorf("sys", "检查goforever命令失败:%s", err.Error())
  61. } else {
  62. if !isRun {
  63. //这里重启goforever
  64. //err := exec.Command("/usr/app/goforever/goforever", "&").Run()
  65. //err := exec.Command("/bin/sh", "-c", "/usr/app/goforever/goforever ./goforever &").Run()
  66. err := exec.Command("/bin/sh", "-c", "/usr/app/goforever ./goforever &").Run()
  67. if err != nil {
  68. util.GetTagLog().Errorf("sys", "重启goforever出错: %s", err.Error())
  69. } else {
  70. util.GetTagLog().Info("sys", "重启goforever成功,当前时间:", util.MlNow().String())
  71. }
  72. } else {
  73. util.GetTagLog().Info("sys", "goforever进程正在运行:", util.MlNow().String())
  74. }
  75. }
  76. }
  77. }
  78. // SyncTime 每半小时同步一次时间
  79. func SyncTime(args ...interface{}) interface{} {
  80. for {
  81. if appConfig.NtpServer == "" {
  82. time.Sleep(30 * time.Minute)
  83. continue
  84. }
  85. err := exec.Command("ntpclient", "-h", appConfig.NtpServer, "-s").Run()
  86. if err != nil {
  87. util.GetTagLog().Errorf("sys", "时间同步失败:%s", err.Error())
  88. } else {
  89. util.GetTagLog().Info("sys", "时间同步成功,当前时间:", util.MlNow().String())
  90. }
  91. time.Sleep(30 * time.Minute)
  92. }
  93. }
  94. func SignalProcess(args ...interface{}) interface{} {
  95. for {
  96. ch := make(chan os.Signal)
  97. signal.Notify(ch, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGKILL, syscall.SIGQUIT)
  98. util.GetTagLog().Info("sys", "检测到退出信号:", <-ch)
  99. }
  100. return 0
  101. }
  102. // func HttpProcess(w http.ResponseWriter, r *http.Request) {
  103. // if GetMonitorStatus().GetMonitorRunStatus() {
  104. // fmt.Fprintf(w, "1")
  105. // } else {
  106. // fmt.Fprintf(w, "0")
  107. // }
  108. // }
  109. func main() {
  110. runtime.GOMAXPROCS(runtime.NumCPU() * 2)
  111. util.InitLogrus("release")
  112. go func() {
  113. util.GetTagLog().Info("sys", http.ListenAndServe(":9999", nil))
  114. }()
  115. util.GetTagLog().Infof("sys", "当前程序版本:%s", appname+" "+version)
  116. if err := loadAppConfig(); err != nil {
  117. util.GetTagLog().Errorf("sys", "loadAppConfig错误:%s", err.Error())
  118. return
  119. }
  120. //升级检查
  121. if appConfig.Upgrade {
  122. EnableUpdate()
  123. }
  124. if err := loadSerialConfig(); err != nil {
  125. util.GetTagLog().Errorf("sys", "loadAppConfig错误:%s", err.Error())
  126. return
  127. }
  128. IDGen.InitIdWorker(1000, 1)
  129. GetMQTTMgr()
  130. InitRedis(&util.RedisConfig{Redis_Address: appConfig.Edge.Redis.Server, Redis_Password: appConfig.Edge.Redis.Password})
  131. defer UninitRedis()
  132. InitCloudMqttSubscribeTopics()
  133. //初始化日志配置(加载持久化级别或使用默认值)
  134. InitLogCfg()
  135. // 启动健康检测(检测部署标记文件)
  136. go StartHealthCheckIfNeeded()
  137. //打开串口
  138. GetSerialMgr().AddSerialPorts(serialConfig.Serial)
  139. //创建设备并启动数据处理流程
  140. for k := range serialConfig.Serial {
  141. devinfos, err := LoadDev(k)
  142. if err != nil {
  143. util.GetTagLog().Warnf("sys", "加载串口[%d]的设备配置文件dev/%d.json失败: %v ,该串口无设备将被跳过", k, k, err)
  144. continue
  145. }
  146. GetDeviceMgr().AddDevices(devinfos)
  147. }
  148. // 启动本地部署 HTTP 服务(端口9998)
  149. StartDeployHTTP()
  150. gopool = util.NewPool(10)
  151. GetMQTTMgr().SetRestartFn(func(fn func(args ...interface{}) interface{}, args ...interface{}) {
  152. gopool.Add(fn, args)
  153. })
  154. gopool.Add(SyncTime, 0)
  155. // gopool.Add(WatchGoforever, 0)
  156. // gopool.Add(SignalProcess, 8)
  157. gopool.Add(WatchDevConfig, 1)
  158. gopool.Add(WatchModelConfig, 2)
  159. gopool.Add(WatchConfConfig, 3)
  160. gopool.Add(GetMQTTMgr().MQTTMessageHandle, 4)
  161. gopool.Add(GetMQTTMgr().MQTTConnectMgr, 5)
  162. gopool.Add(Stat, 6)
  163. gopool.Add(RadarReceive, 7)
  164. gopool.Add(CleanLogs, 9)
  165. gopool.Add(Heartbeat, 10)
  166. gopool.Run()
  167. gopool.Wait()
  168. }