繁体   English   中英

在 Golang 中执行 bpftrace shell 命令的奇怪行为?

[英]Weird behavior for executing a bpftrace shell command in Golang?

我想要什么?

解析基本上在 POD 内运行的命令的 output

Shell 命令:

bpftrace -p 13111 -e uretprobe:/ebpfKit/Examples/cpp/main:enqueue { @[pid] = count(); interval:s:1{ print(@); clear(@); }

用于解析的代码:

func RunUretprobe(tool string, loguretprobe chan Log, pid string, filepath string, funcname string) {

            fmt.Println("checkpoint 1")
            command  := `uretprobe:` + filepath + `:` + funcname + `{ @[pid] = count(); }` +`interval:s:1` + `{ print(@); clear(@); }`
            cmd := exec.Command("bpftrace", "-p", pid , "-e", command)
            fmt.Println(cmd)
            stdout, err := cmd.StdoutPipe()
            if err != nil {
                    log.Fatal(err)
            }
            cmd.Start()
            buf := bufio.NewReader(stdout)
            fmt.Println("checkpoint 2")
            for {
    
                    line, _, _ := buf.ReadLine()
                    parsedLine := strings.Fields(string(line))
                    fmt.Println("checkpoint 3 -", cmd)
                    if (len(parsedLine) > 0) && parsedLine[0] != "Attaching"{
                            s := strings.Split(parsedLine[0], "[")
                            sep := strings.Split(s[1], "]")
                            log := sep[0] + " " + parsedLine[1]
                            timest := 0.00
                            fmt.Println("count--", log)
                            n := Log{Fulllog: log, Pid: 1234, Time: timest, Probe: tool}
                            loguretprobe <- n
    
                    }
            }
    }
    
    func main() {
    
    
    loguretprobe := make(chan Log, 1)
    
    go RunUretprobe("uretprobe", loguretprobe, "13111" , "/ebpfKit/Examples/cpp/main" , "enqueue")
    go func() {
    
            for val := range loguretprobe{
    
                    fmt.Println("Printing - ", val.Fulllog);
                    time.Sleep(time.Duration(1) * time.Second)
    
            }
    
    }()
    
    for{
            time.Sleep(time.Duration(1) * time.Second)
    }
    
    }

问题:

当我手动进入 POD 运行上面编写的程序时,它按要求工作。

在此处输入图像描述

但是,当我通过 gRPC 客户端从另一个程序调用RunUretprobe时,它给了我以下损坏的命令(我使用kubectl logs "pod_name"了日志),如图所示:

在此处输入图像描述

期待:

获得如第一张图片所示的单个命令,以便它被执行并稍后被解析。

添加字符串“/n”后,我使用以下内容删除了换行符以使其按预期工作:

filepath = strings.Replace(filepath, "\n", "", -1)
funcname = strings.Replace(funcname, "\n", "", -1)
command  := `uretprobe:` + filepath + `:` + funcname + `{ @[pid] = count(); }` +`interval:s:1` + `{ print(@); clear(@); }`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM