u_exec.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package util
  2. import (
  3. "fmt"
  4. "os"
  5. "os/exec"
  6. "strconv"
  7. "strings"
  8. )
  9. // GetSubProcessPid 只用于一个子进程
  10. func GetSubProcessPid(pid int) (int, error) {
  11. pgrepCmd := exec.Command("pgrep", "-P", strconv.Itoa(pid))
  12. output, err := pgrepCmd.CombinedOutput()
  13. if err != nil {
  14. return 0, err
  15. }
  16. replace := strings.Replace(string(output), "\n", "", 1)
  17. subProcessPid, err := strconv.Atoi(replace)
  18. if err != nil {
  19. return 0, err
  20. }
  21. return subProcessPid, nil
  22. }
  23. func ExecuteWithPath(path string, name string, arg ...string) (*exec.Cmd, error) {
  24. // 创建一个Cmd对象,表示要执行的命令
  25. cmd := exec.Command(name, arg...)
  26. // 指定目录
  27. cmd.Dir = path
  28. err := cmd.Start()
  29. if err != nil {
  30. return nil, err
  31. } else {
  32. // 执行命令并等待它完成d
  33. return cmd, nil
  34. }
  35. }
  36. func ExecuteWithDirAsync(dir string, name string, arg ...string) (*exec.Cmd, error) {
  37. // 创建一个Cmd对象,表示要执行的命令
  38. cmd := exec.Command(name, arg...)
  39. // 指定目录
  40. cmd.Dir = dir
  41. go func() {
  42. _, output, err := ExecuteWithDirSync(dir, name, arg...)
  43. if err != nil {
  44. fmt.Println("Error waiting for command,【output】=", output, ",【err】=", err)
  45. }
  46. }()
  47. return cmd, nil
  48. }
  49. //func ExecuteWithDirAsync(dir string, name string, arg ...string) (*exec.Cmd, error) {
  50. // // 创建一个Cmd对象,表示要执行的命令
  51. // cmd := exec.Command(name, arg...)
  52. // // 指定目录
  53. // cmd.Dir = dir
  54. // err := cmd.Start()
  55. // if err != nil {
  56. // return nil, err
  57. // } else {
  58. // return cmd, nil
  59. // }
  60. //}
  61. func ExecuteWithDirSync(dir string, name string, arg ...string) (*exec.Cmd, string, error) {
  62. cmd := exec.Command(name, arg...)
  63. cmd.Dir = dir
  64. combinedOutput, err := cmd.CombinedOutput()
  65. if err != nil {
  66. return nil, "", err
  67. }
  68. return cmd, string(combinedOutput), nil
  69. }
  70. func ExecuteWithEnvAndDirAsync(envs []string, dir string, name string, arg ...string) (*exec.Cmd, error) {
  71. cmd := exec.Command(name, arg...)
  72. cmd.Dir = dir
  73. for _, env := range envs {
  74. cmd.Env = append(cmd.Env, env)
  75. }
  76. if err := cmd.Start(); err != nil {
  77. return nil, err
  78. }
  79. return cmd, nil
  80. }
  81. // KillProcessByPid 必须使用该golang原生方法,通过直接执行kill命令行不通。
  82. func KillProcessByPid(pid int) error {
  83. process, err := os.FindProcess(pid)
  84. if err != nil {
  85. return err
  86. }
  87. err = process.Kill()
  88. if err != nil {
  89. return err
  90. }
  91. return nil
  92. }
  93. func Execute(name string, arg ...string) (*exec.Cmd, string, error) {
  94. cmd := exec.Command(name, arg...)
  95. combinedOutput, err := cmd.CombinedOutput()
  96. if err != nil {
  97. return nil, "", err
  98. }
  99. return cmd, string(combinedOutput), nil
  100. }
  101. func ExecuteSync(name string, arg ...string) (*exec.Cmd, string, error) {
  102. cmd := exec.Command(name, arg...)
  103. combinedOutput, err := cmd.CombinedOutput()
  104. if err != nil {
  105. return nil, "", err
  106. }
  107. return cmd, string(combinedOutput), nil
  108. }
  109. func ExecuteWithEnvSync(envs []string, name string, arg ...string) (*exec.Cmd, string, error) {
  110. cmd := exec.Command(name, arg...)
  111. for _, env := range envs {
  112. cmd.Env = append(cmd.Env, env)
  113. }
  114. combinedOutput, err := cmd.CombinedOutput()
  115. if err != nil {
  116. return nil, "", err
  117. }
  118. return cmd, string(combinedOutput), nil
  119. }
  120. func ExecuteWithEnvAndDir(envs []string, dir string, name string, arg ...string) (*exec.Cmd, string, error) {
  121. cmd := exec.Command(name, arg...)
  122. cmd.Dir = dir
  123. for _, env := range envs {
  124. cmd.Env = append(cmd.Env, env)
  125. }
  126. combinedOutput, err := cmd.CombinedOutput()
  127. if err != nil {
  128. return nil, string(combinedOutput), err
  129. }
  130. return cmd, string(combinedOutput), nil
  131. }