孟令鑫 1 年之前
父節點
當前提交
16a15f59a0
共有 1 個文件被更改,包括 18 次插入7 次删除
  1. 18 7
      kinglong/common/svc/kill_self.go

+ 18 - 7
kinglong/common/svc/kill_self.go

@@ -4,9 +4,11 @@ import (
 	"cicv-data-closedloop/kinglong/common/cfg"
 	"cicv-data-closedloop/kinglong/common/log"
 	"cicv-data-closedloop/kinglong/common/util"
+	commonConfig "cicv-data-closedloop/pji/common/cfg"
 	"net/rpc"
 	"os"
 	"sync"
+	"time"
 )
 
 var (
@@ -34,7 +36,9 @@ type KillService struct{}
 // Kill 杀死自身程序,通过通道实现 方法必须满足RPC规范:函数有两个参数,第一个参数是请求,第二个是响应
 func (m *KillService) Kill(args *KillSignal, reply *int) error {
 	log.GlobalLogger.Info("接收到自杀信号:", *args)
+	// 1 杀死 rosbag record 命令
 	ChannelKillRosRecord <- 1
+	// 2 杀死所有 ros 订阅者
 	ChannelKillWindowProducer <- 1
 	if args.DropUploadData == true {
 		// 3-1 等待上传结束再杀死
@@ -45,7 +49,7 @@ func (m *KillService) Kill(args *KillSignal, reply *int) error {
 		ChannelKillMove <- 2
 		ChannelKillConsume <- 2
 	}
-	go killDone()
+	go killDone(args.Restart)
 	return nil
 }
 func WaitKillSelf() {
@@ -94,12 +98,19 @@ func AddKillTimes(info string) {
 	MutexKill.Unlock()
 }
 
-func killDone() {
-	log.GlobalLogger.Infof("自杀完毕,启动新的程序。")
-	if KillChannel == KillTimes {
-		if _, err := util.ExecuteWithPath(cfg.LocalConfig.RestartDir, cfg.LocalConfig.RestartCmd); err != nil {
-			log.GlobalLogger.Error("启动新的程序失败:", err)
+func killDone(restart bool) {
+	for {
+		time.Sleep(time.Duration(1) * time.Second)
+		if KillChannel == KillTimes {
+			if restart {
+				_, err := util.ExecuteWithPath(commonConfig.LocalConfig.RestartCmd.Dir, commonConfig.LocalConfig.RestartCmd.Name, commonConfig.LocalConfig.RestartCmd.Args...)
+				if err != nil {
+					log.GlobalLogger.Info("启动新程序失败,【path】=", commonConfig.LocalConfig.RestartCmd.Dir, "【cmd】=", commonConfig.LocalConfig.RestartCmd.Name, commonConfig.LocalConfig.RestartCmd.Args, ":", err)
+					os.Exit(-1)
+				}
+			}
+			log.GlobalLogger.Info("程序已被更新,正常退出")
+			os.Exit(0)
 		}
-		os.Exit(0)
 	}
 }