cmd.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package utils
  2. import (
  3. "bytes"
  4. "context"
  5. "os/exec"
  6. "pbx-api-gin/pkg/lfshook"
  7. "time"
  8. )
  9. //ExecCmdAsync 执行指定命令
  10. func ExecCmdAsync(cmdName string, arg ...string) (stdOut, errOut string, err error) {
  11. cmd := exec.Command(cmdName, arg...)
  12. var stdout, stderr bytes.Buffer
  13. cmd.Stdout = &stdout
  14. cmd.Stderr = &stderr
  15. err = cmd.Run()
  16. if err != nil {
  17. lfshook.NewLogger().Errorf("cmd.Run(%s) failed with %s\n", cmdName, err)
  18. }
  19. outStr, errStr := string(stdout.Bytes()), string(stderr.Bytes())
  20. if len(outStr) > 0 {
  21. lfshook.NewLogger().Debugf("cmd.Run(%s) %s", cmdName, outStr)
  22. }
  23. if len(errStr) > 0 {
  24. lfshook.NewLogger().Errorf("cmd.Run(%s)%s", cmdName, errStr)
  25. }
  26. return outStr, errStr, err
  27. }
  28. //ExecCmd 执行指定命令
  29. func ExecCmd(cmdName string, arg ...string) (stdOut, errOut string, err error) {
  30. cmd := exec.Command(cmdName, arg...)
  31. var stdout, stderr bytes.Buffer
  32. cmd.Stdout = &stdout
  33. cmd.Stderr = &stderr
  34. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  35. defer cancel()
  36. err = cmd.Start()
  37. if err != nil {
  38. lfshook.NewLogger().Error(err)
  39. return "", "", err
  40. }
  41. go func() {
  42. err = cmd.Wait()
  43. if err != nil {
  44. lfshook.NewLogger().Errorf("cmd.Wait(%s) %s\n", cmdName, err)
  45. } else {
  46. lfshook.NewLogger().Info("cmd.Wait(%s)\n", cmdName)
  47. }
  48. cancel()
  49. }()
  50. select {
  51. case <-ctx.Done():
  52. }
  53. outStr, errStr := string(stdout.Bytes()), string(stderr.Bytes())
  54. if len(outStr) > 0 {
  55. lfshook.NewLogger().Debugf("cmd.Start(%s) %s", cmdName, outStr)
  56. }
  57. if len(errStr) > 0 {
  58. lfshook.NewLogger().Errorf("cmd.Start(%s)%s", cmdName, errStr)
  59. }
  60. return outStr, errStr, err
  61. }