在 Golang 中执行 bpftrace shell 命令的奇怪行为?
Weird behavior for executing a bpftrace shell command in Golang?
我想要什么?
解析基本上 运行s 在 POD
中的命令输出
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(@); }`
我想要什么?
解析基本上 运行s 在 POD
中的命令输出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(@); }`