LingxinMeng vor 9 Monaten
Ursprung
Commit
5f72994059

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

@@ -15,6 +15,7 @@ func BagRecord(nodeName string) {
 	var err error
 	c_log.GlobalLogger.Info("rosbag record goroutine - 启动")
 	for {
+	startRecord:
 		c_log.GlobalLogger.Info("校验必需的 rosnode 是否全部启动。")
 		canRecord := false
 		for !canRecord {
@@ -78,37 +79,26 @@ func BagRecord(nodeName string) {
 		}
 		// 等待自杀信号
 		c_log.GlobalLogger.Info("启动record命令成功。等待自杀信号。")
-		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命令一直录包占满存储
+		for {
+			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命令一直录包占满存储
+					}
+					AddKillTimes("1")
+					continue
 				}
-				if err = cmd.Process.Kill(); err != nil {
-					c_log.GlobalLogger.Error("程序阻塞,杀死record命令进程", recordProcessPid, "出错:", err)
-					select {} // 此处阻塞防止record命令一直录包占满存储
+				if signal == 2 {
+					continue startRecord // 收到信号 2 重新 record 命令
 				}
-				AddKillTimes("1")
-				return
 			}
 		}
-
-		// TODO 暂时不放开该逻辑。如果监控rosnode来判断是否杀死record,太麻烦,生成窗口的线程也需要关闭
-		//{
-		//	commonCfg.GlobalLogger.Info("正在监控rosnode是否全部关闭。")
-		//	for canRecord {
-		//		time.Sleep(time.Duration(1) * time.Second)
-		//		canRecord = isCanRecord(commonCfg.RosNode)
-		//	}
-		//	commonCfg.GlobalLogger.Info("rosnode已全部关闭,正在结束record进程。")
-		//
-		//	err = cmd.Process.Kill()
-		//	if err != nil {
-		//		commonCfg.GlobalLogger.Error("杀死record进程错误:", err)
-		//		continue
-		//	}
-		//}
 	}
 }
 

+ 5 - 2
aarch64/pjibot_delivery/common/service/rosbag_upload.go

@@ -77,7 +77,7 @@ outLoop:
 					continue
 				}
 				// 删除旧文件
-				util.DeleteFile(oldName)
+				_ = util.DeleteFile(oldName)
 				// 将新文件改回旧文件名
 				if err = os.Rename(newName, oldName); err != nil {
 					c_log.GlobalLogger.Info("修改文件名", oldName, "失败,放弃当前时间窗口", currentTimeWindow.FaultTime, ",错误为:", err)
@@ -154,6 +154,9 @@ outLoop:
 		if err = util.RemoveDir(dir); err != nil {
 			continue outLoop
 		}
-
+		if len(entity.TimeWindowConsumerQueue) == 0 {
+			c_log.GlobalLogger.Infof("已处理所有窗口,重启 record 命令。")
+			ChannelKillRosRecord <- 2
+		}
 	}
 }

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

@@ -33,6 +33,9 @@ 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

+ 19 - 29
aarch64/pjibot_guide/common/service/rosbag_record.go

@@ -15,6 +15,7 @@ func BagRecord(nodeName string) {
 	var err error
 	c_log.GlobalLogger.Info("rosbag record goroutine - 启动")
 	for {
+	startRecord:
 		c_log.GlobalLogger.Info("校验必需的 rosnode 是否全部启动。")
 		canRecord := false
 		for !canRecord {
@@ -76,39 +77,28 @@ func BagRecord(nodeName string) {
 				}
 			}
 		}
-		// 等待自杀信号
-		c_log.GlobalLogger.Info("启动record命令成功。等待自杀信号。")
-		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命令一直录包占满存储
+		// 等待进程关闭信号
+		c_log.GlobalLogger.Info("启动record命令成功。等待进程关闭信号。")
+		for {
+			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命令一直录包占满存储
+					}
+					AddKillTimes("1")
+					continue // continue 是为了等待重启信号
 				}
-				if err = cmd.Process.Kill(); err != nil {
-					c_log.GlobalLogger.Error("程序阻塞,杀死record命令进程", recordProcessPid, "出错:", err)
-					select {} // 此处阻塞防止record命令一直录包占满存储
+				if signal == 2 {
+					continue startRecord // 收到信号 2 重新 record 命令
 				}
-				AddKillTimes("1")
-				return
 			}
 		}
-
-		// TODO 暂时不放开该逻辑。如果监控rosnode来判断是否杀死record,太麻烦,生成窗口的线程也需要关闭
-		//{
-		//	commonCfg.GlobalLogger.Info("正在监控rosnode是否全部关闭。")
-		//	for canRecord {
-		//		time.Sleep(time.Duration(1) * time.Second)
-		//		canRecord = isCanRecord(commonCfg.RosNode)
-		//	}
-		//	commonCfg.GlobalLogger.Info("rosnode已全部关闭,正在结束record进程。")
-		//
-		//	err = cmd.Process.Kill()
-		//	if err != nil {
-		//		commonCfg.GlobalLogger.Error("杀死record进程错误:", err)
-		//		continue
-		//	}
-		//}
 	}
 }
 

+ 4 - 0
aarch64/pjibot_guide/common/service/rosbag_upload.go

@@ -173,5 +173,9 @@ outLoop:
 		if err = util.RemoveDir(dir); err != nil {
 			continue outLoop
 		}
+		if len(entity.TimeWindowConsumerQueue) == 0 {
+			c_log.GlobalLogger.Infof("已处理所有窗口,重启 record 命令。")
+			ChannelKillRosRecord <- 2
+		}
 	}
 }

+ 3 - 0
aarch64/pjibot_guide/master/package/service/move_bag_and_send_window.go

@@ -33,6 +33,9 @@ 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

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

@@ -15,6 +15,7 @@ func BagRecord(nodeName string) {
 	var err error
 	c_log.GlobalLogger.Info("rosbag record goroutine - 启动")
 	for {
+	startRecord:
 		c_log.GlobalLogger.Info("校验必需的 rosnode 是否全部启动。")
 		canRecord := false
 		for !canRecord {
@@ -78,37 +79,26 @@ func BagRecord(nodeName string) {
 		}
 		// 等待自杀信号
 		c_log.GlobalLogger.Info("启动record命令成功。等待自杀信号。")
-		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命令一直录包占满存储
+		for {
+			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命令一直录包占满存储
+					}
+					AddKillTimes("1")
+					continue
 				}
-				if err = cmd.Process.Kill(); err != nil {
-					c_log.GlobalLogger.Error("程序阻塞,杀死record命令进程", recordProcessPid, "出错:", err)
-					select {} // 此处阻塞防止record命令一直录包占满存储
+				if signal == 2 {
+					continue startRecord // 收到信号 2 重新 record 命令
 				}
-				AddKillTimes("1")
-				return
 			}
 		}
-
-		// TODO 暂时不放开该逻辑。如果监控rosnode来判断是否杀死record,太麻烦,生成窗口的线程也需要关闭
-		//{
-		//	commonCfg.GlobalLogger.Info("正在监控rosnode是否全部关闭。")
-		//	for canRecord {
-		//		time.Sleep(time.Duration(1) * time.Second)
-		//		canRecord = isCanRecord(commonCfg.RosNode)
-		//	}
-		//	commonCfg.GlobalLogger.Info("rosnode已全部关闭,正在结束record进程。")
-		//
-		//	err = cmd.Process.Kill()
-		//	if err != nil {
-		//		commonCfg.GlobalLogger.Error("杀死record进程错误:", err)
-		//		continue
-		//	}
-		//}
 	}
 }
 

+ 4 - 0
aarch64/pjibot_patrol/common/service/rosbag_upload.go

@@ -154,6 +154,10 @@ outLoop:
 		if err = util.RemoveDir(dir); err != nil {
 			continue outLoop
 		}
+		if len(entity.TimeWindowConsumerQueue) == 0 {
+			c_log.GlobalLogger.Infof("已处理所有窗口,重启 record 命令。")
+			ChannelKillRosRecord <- 2
+		}
 
 	}
 }

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

@@ -33,6 +33,9 @@ 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