孟令鑫 hai 1 ano
pai
achega
11491cd040
Modificáronse 1 ficheiros con 33 adicións e 20 borrados
  1. 33 20
      pji/common/svc/rosbag_record.go

+ 33 - 20
pji/common/svc/rosbag_record.go

@@ -6,11 +6,14 @@ import (
 	"cicv-data-closedloop/pji/common/cfg"
 	"cicv-data-closedloop/pji/common/cutil"
 	"github.com/bluenviron/goroslib/v2"
+	"os"
+	"os/exec"
 	"time"
 )
 
 // BagRecord 打包rosbag
 func BagRecord(nodeName string) {
+	var err error
 	c_log.GlobalLogger.Info("rosbag record goroutine - 启动")
 	for {
 		c_log.GlobalLogger.Info("校验必需的 rosnode 是否全部启动。")
@@ -36,34 +39,44 @@ func BagRecord(nodeName string) {
 		// 2 ------- 调用 rosbag 打包命令,该命令自动阻塞 -------
 		// 不在此处压缩,因为 rosbag filter 时会报错。在上传到oss之前压缩即可。
 		// 包名格式:2023-11-15-17-35-20_0.bag
-		cutil.CreateParentDir(cfg.CloudConfig.BagDataDir)
-		//cmd, err := util.ExecuteWithDirAsync(cfg.CloudConfig.BagDataDir, "/opt/ros/melodic/bin/rosbag", command...)
-		//if err != nil {
-		//	c_log.GlobalLogger.Error("执行record命令", command, "出错:", err)
-		//	continue
-		//}
-		cmd, output, err := util.ExecuteWithDirSync(cfg.CloudConfig.BagDataDir, "/opt/ros/melodic/bin/rosbag", command...)
-		if err != nil {
-			c_log.GlobalLogger.Error("执行record命令", command, "出错:【output】=", output, "【err】=", err)
-			continue
-		}
-		c_log.GlobalLogger.Info("启动record命令成功。")
-		recordProcessPid := cmd.Process.Pid
+		_ = cutil.CreateParentDir(cfg.CloudConfig.BagDataDir)
+		var recordProcessPid int
 		var recordSubProcessPid int
+		var cmd *exec.Cmd
+	parent:
 		for {
-			time.Sleep(time.Duration(2) * time.Second)
-			recordSubProcessPid, err = util.GetSubProcessPid(recordProcessPid)
+			cmd, err = util.ExecuteWithDirAsync(cfg.CloudConfig.BagDataDir, "/opt/ros/melodic/bin/rosbag", command...)
 			if err != nil {
-				c_log.GlobalLogger.Info("正在等待获取进程 ", recordProcessPid, " 的子进程的pid。")
+				c_log.GlobalLogger.Error("执行record命令", command, "出错:", err)
 				continue
 			}
-			if recordSubProcessPid != 0 {
-				c_log.GlobalLogger.Info("获取进程 ", recordProcessPid, " 的子进程的pid:", recordSubProcessPid)
-				break
+			//cmd, output, err := util.ExecuteWithDirSync(cfg.CloudConfig.BagDataDir, "/opt/ros/melodic/bin/rosbag", command...)
+			//if err != nil {
+			//	c_log.GlobalLogger.Error("执行record命令", command, "出错:【output】=", output, "【err】=", err)
+			//	continue
+			//}
+
+			recordProcessPid = cmd.Process.Pid
+		sub:
+			for {
+				time.Sleep(time.Duration(2) * time.Second)
+				process, err := os.FindProcess(recordProcessPid)
+				if process == nil {
+					continue parent
+				}
+				recordSubProcessPid, err = util.GetSubProcessPid(recordProcessPid)
+				if err != nil {
+					c_log.GlobalLogger.Info("正在等待获取进程 ", recordProcessPid, " 的子进程的pid。")
+					continue sub
+				}
+				if recordSubProcessPid != 0 {
+					c_log.GlobalLogger.Info("获取进程 ", recordProcessPid, " 的子进程的pid:", recordSubProcessPid)
+					break parent
+				}
 			}
 		}
 		// 等待自杀信号
-		c_log.GlobalLogger.Info("rosbag record goroutine - 等待自杀信号")
+		c_log.GlobalLogger.Info("启动record命令成功。等待自杀信号。")
 		select {
 		case signal := <-ChannelKillRosRecord:
 			if signal == 1 {