jattach_linux_arm64.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package jattach
  2. ///*
  3. //#cgo CFLAGS: -I include
  4. //#cgo amd64 LDFLAGS: ${SRCDIR}/lib/libjattach_amd64.a
  5. //#cgo arm64 LDFLAGS: ${SRCDIR}/lib/libjattach_arm64.a
  6. //#include <stdlib.h>
  7. //// declaration jattach
  8. //int jattach(int pid, int argc, char** argv, int print_output);
  9. //*/
  10. //import "C"
  11. import (
  12. "fmt"
  13. "github.com/coroot/coroot-node-agent/utils"
  14. "github.com/coroot/coroot-node-agent/utils/enums"
  15. klog "github.com/sirupsen/logrus"
  16. "os"
  17. "strings"
  18. )
  19. type JvmJattacher struct {
  20. Pid uint32
  21. Args []string
  22. PrintOutput int
  23. }
  24. func (j *JvmJattacher) JAttach() (int, error) {
  25. // cmd方式
  26. cwJattachCmdPath := utils.GetDefaultScriptsPath("apmjattach")
  27. // 执行升级
  28. args := []string{fmt.Sprintf("%d", j.Pid)}
  29. args = append(args, j.Args...)
  30. result, err := utils.AuthoritativeCMD(enums.RootUser, enums.DefaultTimeOut, os.Environ(), cwJattachCmdPath, args...)
  31. if err != nil {
  32. return -1, err
  33. }
  34. if strings.Contains(result, "JVM response code = 0") {
  35. return 0, nil
  36. } else {
  37. return -1, fmt.Errorf("JVM returned %s", result)
  38. }
  39. //
  40. //cArgs := make([]*C.char, len(j.Args))
  41. //for i, arg := range j.Args {
  42. // cArgs[i] = C.CString(arg)
  43. // defer C.free(unsafe.Pointer(cArgs[i])) // free mem
  44. //}
  45. //
  46. //// call C func jattach
  47. //// cArgs to **C.char
  48. //result := C.jattach(C.int(j.Pid), C.int(len(j.Args)), (**C.char)(unsafe.Pointer(&cArgs[0])), C.int(j.PrintOutput))
  49. //if int(result) != 0 {
  50. // return int(result), fmt.Errorf("[JAttach] jattacher failed")
  51. //}
  52. //return int(result), nil
  53. }
  54. func (j *JvmJattacher) JDetach() (int, error) {
  55. // cmd方式
  56. cwJattachCmdPath := utils.GetDefaultScriptsPath("apmjattach")
  57. // 执行升级
  58. args := []string{fmt.Sprintf("%d", j.Pid)}
  59. args = append(args, j.Args...)
  60. result, err := utils.AuthoritativeCMD(enums.RootUser, enums.DefaultTimeOut, os.Environ(), cwJattachCmdPath, args...)
  61. if err != nil {
  62. klog.WithError(err).Errorf("Failed to detach JVM process")
  63. return -1, err
  64. }
  65. if strings.Contains(result, "JVM response code = 0") {
  66. return 0, nil
  67. } else {
  68. return -1, fmt.Errorf("JVM returned %s", result)
  69. }
  70. }