getjdkversion.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package ebpftracer
  2. import (
  3. "fmt"
  4. "os"
  5. "os/exec"
  6. "bytes"
  7. "strings"
  8. )
  9. func parseQuotedString(input string) (string, error) {
  10. // 找到第一个双引号的位置
  11. start := strings.Index(input, "\"")
  12. if start == -1 {
  13. return "", fmt.Errorf("no start quote found")
  14. }
  15. // 找到第二个双引号的位置
  16. end := strings.Index(input[start+1:], "\"")
  17. if end == -1 {
  18. return "", fmt.Errorf("no end quote found")
  19. }
  20. // 提取开始和结束引号之间的内容
  21. content := input[start+1 : start+1+end]
  22. return content, nil
  23. }
  24. // getExecutablePath 根据进程ID获取可执行文件的真实路径。
  25. func getExecutablePath(pid uint32) (string, error) {
  26. // 构造文件路径
  27. link := fmt.Sprintf("/proc/%d/exe", pid)
  28. // 使用os.Readlink获取符号链接指向的路径
  29. execPath, err := os.Readlink(link)
  30. if err != nil {
  31. return "", err
  32. }
  33. return execPath, nil
  34. }
  35. func UsePIDToGetJDKVersion(pid uint32) string{
  36. execPath, err := getExecutablePath(pid)
  37. if err != nil {
  38. fmt.Println("Error:", err)
  39. return ""
  40. }
  41. // 构建Command对象
  42. cmd := exec.Command(execPath, "-version")
  43. // 创建缓冲区保存输出
  44. var out bytes.Buffer
  45. var stderr bytes.Buffer
  46. cmd.Stdout = &out
  47. cmd.Stderr = &stderr // java -version 实际是写入Stderr
  48. // 运行命令
  49. err = cmd.Run()
  50. if err != nil {
  51. fmt.Println("Command execution error:", err)
  52. fmt.Println("Error output:", stderr.String())
  53. return ""
  54. }
  55. // 打印输出信息
  56. version, err := parseQuotedString(stderr.String())
  57. if err != nil {
  58. fmt.Println("Error:", err)
  59. return ""
  60. }
  61. return version
  62. }