|
|
@@ -0,0 +1,73 @@
|
|
|
+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
|
|
|
+
|
|
|
+}
|