LingxinMeng 9 mesi fa
parent
commit
dde493745f

+ 17 - 10
aarch64/pjibot_delivery/common/service/rosbag_record.go

@@ -83,25 +83,32 @@ func BagRecord(nodeName string) {
 			select {
 			case signal := <-ChannelKillRosRecord:
 				if signal == 1 {
-					if err := util.KillProcessByPid(recordSubProcessPid); err != nil {
-						c_log.GlobalLogger.Errorf("程序阻塞,杀死record命令子进程出错,【pid】=%v,【err】=%v。", recordSubProcessPid, err)
-						select {} // 此处阻塞防止record命令一直录包占满存储
-					}
-					if err = cmd.Process.Kill(); err != nil {
-						c_log.GlobalLogger.Error("程序阻塞,杀死record命令进程", recordProcessPid, "出错:", err)
-						select {} // 此处阻塞防止record命令一直录包占满存储
-					}
+					kill(recordProcessPid, recordSubProcessPid, cmd)
 					AddKillTimes("1")
-					continue
+					continue // continue 是为了等待重启信号
 				}
 				if signal == 2 {
 					goto startRecord // 收到信号 2 重新 record 命令
 				}
+				if signal == 3 { // 这个关闭是等待数据处理时的关闭
+					c_log.GlobalLogger.Error("采集数据,接收record命令进程关闭信号:", signal)
+					kill(recordProcessPid, recordSubProcessPid, cmd)
+					continue
+				}
 			}
 		}
 	}
 }
-
+func kill(recordProcessPid int, recordSubProcessPid int, cmd *exec.Cmd) {
+	if err := util.KillProcessByPid(recordSubProcessPid); err != nil {
+		c_log.GlobalLogger.Errorf("程序阻塞,杀死record命令子进程出错,【pid】=%v,【err】=%v。", recordSubProcessPid, err)
+		select {} // 此处阻塞防止record命令一直录包占满存储
+	}
+	if err := cmd.Process.Kill(); err != nil {
+		c_log.GlobalLogger.Error("程序阻塞,杀死record命令进程", recordProcessPid, "出错:", err)
+		select {} // 此处阻塞防止record命令一直录包占满存储
+	}
+}
 func isCanRecord(n *goroslib.Node) bool {
 	time.Sleep(time.Duration(1) * time.Second)
 	// 获取

+ 3 - 3
aarch64/pjibot_delivery/master/package/service/move_bag_and_send_window.go

@@ -33,9 +33,6 @@ func RunTimeWindowProducerQueue() {
 		// 处理
 		time.Sleep(time.Duration(1) * time.Second)
 		if len(entity.TimeWindowProducerQueue) > 0 {
-			// 如果有可处理的,先把record命令杀掉
-			commonService.ChannelKillRosRecord <- 1
-			// 处理
 			bags, _ := util.ListAbsolutePathWithSuffixAndSort(commonConfig.CloudConfig.BagDataDir, ".bag")
 			currentTimeWindow := entity.TimeWindowProducerQueue[0]
 			move := false
@@ -59,6 +56,9 @@ func RunTimeWindowProducerQueue() {
 			}
 			// 如果没有包可以供当前窗口移动,且已经生成了更新的包,则当前窗口已经可以上传
 			if !move && bigger {
+				time.Sleep(time.Duration(2) * time.Second)
+				c_log.GlobalLogger.Info("采集数据,发送record命令进程关闭信号。")
+				commonService.ChannelKillRosRecord <- 3
 				domain.SupplyCopyBags(commonConfig.CloudConfig.BagDataDir, commonConfig.CloudConfig.BagCopyDir, currentTimeWindow)
 				// 将时间窗口移出准备队列
 				entity.RemoveHeadOfTimeWindowProducerQueue()

+ 17 - 10
aarch64/pjibot_patrol/common/service/rosbag_record.go

@@ -83,25 +83,32 @@ func BagRecord(nodeName string) {
 			select {
 			case signal := <-ChannelKillRosRecord:
 				if signal == 1 {
-					if err := util.KillProcessByPid(recordSubProcessPid); err != nil {
-						c_log.GlobalLogger.Errorf("程序阻塞,杀死record命令子进程出错,【pid】=%v,【err】=%v。", recordSubProcessPid, err)
-						select {} // 此处阻塞防止record命令一直录包占满存储
-					}
-					if err = cmd.Process.Kill(); err != nil {
-						c_log.GlobalLogger.Error("程序阻塞,杀死record命令进程", recordProcessPid, "出错:", err)
-						select {} // 此处阻塞防止record命令一直录包占满存储
-					}
+					kill(recordProcessPid, recordSubProcessPid, cmd)
 					AddKillTimes("1")
-					continue
+					continue // continue 是为了等待重启信号
 				}
 				if signal == 2 {
 					goto startRecord // 收到信号 2 重新 record 命令
 				}
+				if signal == 3 { // 这个关闭是等待数据处理时的关闭
+					c_log.GlobalLogger.Error("采集数据,接收record命令进程关闭信号:", signal)
+					kill(recordProcessPid, recordSubProcessPid, cmd)
+					continue
+				}
 			}
 		}
 	}
 }
-
+func kill(recordProcessPid int, recordSubProcessPid int, cmd *exec.Cmd) {
+	if err := util.KillProcessByPid(recordSubProcessPid); err != nil {
+		c_log.GlobalLogger.Errorf("程序阻塞,杀死record命令子进程出错,【pid】=%v,【err】=%v。", recordSubProcessPid, err)
+		select {} // 此处阻塞防止record命令一直录包占满存储
+	}
+	if err := cmd.Process.Kill(); err != nil {
+		c_log.GlobalLogger.Error("程序阻塞,杀死record命令进程", recordProcessPid, "出错:", err)
+		select {} // 此处阻塞防止record命令一直录包占满存储
+	}
+}
 func isCanRecord(n *goroslib.Node) bool {
 	time.Sleep(time.Duration(1) * time.Second)
 	// 获取

+ 3 - 3
aarch64/pjibot_patrol/master/package/service/move_bag_and_send_window.go

@@ -33,9 +33,6 @@ func RunTimeWindowProducerQueue() {
 		// 处理
 		time.Sleep(time.Duration(1) * time.Second)
 		if len(entity.TimeWindowProducerQueue) > 0 {
-			// 如果有可处理的,先把record命令杀掉
-			commonService.ChannelKillRosRecord <- 1
-			// 处理
 			bags, _ := util.ListAbsolutePathWithSuffixAndSort(commonConfig.CloudConfig.BagDataDir, ".bag")
 			currentTimeWindow := entity.TimeWindowProducerQueue[0]
 			move := false
@@ -59,6 +56,9 @@ func RunTimeWindowProducerQueue() {
 			}
 			// 如果没有包可以供当前窗口移动,且已经生成了更新的包,则当前窗口已经可以上传
 			if !move && bigger {
+				time.Sleep(time.Duration(2) * time.Second)
+				c_log.GlobalLogger.Info("采集数据,发送record命令进程关闭信号。")
+				commonService.ChannelKillRosRecord <- 3
 				domain.SupplyCopyBags(commonConfig.CloudConfig.BagDataDir, commonConfig.CloudConfig.BagCopyDir, currentTimeWindow)
 				// 将时间窗口移出准备队列
 				entity.RemoveHeadOfTimeWindowProducerQueue()