| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- 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
-
- }
|