package ebpftracer import ( "fmt" "os" "os/exec" "bytes" "strings" ) func parseQuotedString(input string) (string, error) { // 找到第一个双引号的位置 start := strings.Index(input, "\"") if start == -1 { return "", fmt.Errorf("no start quote found") } // 找到第二个双引号的位置 end := strings.Index(input[start+1:], "\"") if end == -1 { return "", fmt.Errorf("no end quote found") } // 提取开始和结束引号之间的内容 content := input[start+1 : start+1+end] return content, nil } // getExecutablePath 根据进程ID获取可执行文件的真实路径。 func getExecutablePath(pid uint32) (string, error) { // 构造文件路径 link := fmt.Sprintf("/proc/%d/exe", pid) // 使用os.Readlink获取符号链接指向的路径 execPath, err := os.Readlink(link) if err != nil { return "", err } return execPath, nil } func UsePIDToGetJDKVersion(pid uint32) string{ execPath, err := getExecutablePath(pid) if err != nil { fmt.Println("Error:", err) return "" } // 构建Command对象 cmd := exec.Command(execPath, "-version") // 创建缓冲区保存输出 var out bytes.Buffer var stderr bytes.Buffer cmd.Stdout = &out cmd.Stderr = &stderr // java -version 实际是写入Stderr // 运行命令 err = cmd.Run() if err != nil { fmt.Println("Command execution error:", err) fmt.Println("Error output:", stderr.String()) return "" } // 打印输出信息 version, err := parseQuotedString(stderr.String()) if err != nil { fmt.Println("Error:", err) return "" } return version }