cmd.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package utils
  2. import (
  3. "bytes"
  4. "context"
  5. "crm-api/pkg/lfshook"
  6. "os/exec"
  7. "strings"
  8. "time"
  9. )
  10. // ExecCmdAsync 执行指定命令
  11. func ExecCmdAsync(cmdName string, arg ...string) (stdOut, errOut string, err error) {
  12. lfshook.NewLogger().Infof("ExecCmdAsync cmd %s %s", cmdName, arg)
  13. cmd := exec.Command(cmdName, arg...)
  14. var stdout, stderr bytes.Buffer
  15. cmd.Stdout = &stdout
  16. cmd.Stderr = &stderr
  17. err = cmd.Run()
  18. if err != nil {
  19. lfshook.NewLogger().Errorf("cmd.Run(%s) failed with %s\n", cmdName, err)
  20. }
  21. outStr, errStr := stdout.String(), stderr.String()
  22. if len(outStr) > 0 {
  23. lfshook.NewLogger().Debugf("cmd.Run(%s) %s", cmdName, outStr)
  24. }
  25. if len(errStr) > 0 {
  26. lfshook.NewLogger().Errorf("cmd.Run(%s)%s", cmdName, errStr)
  27. }
  28. return outStr, errStr, err
  29. }
  30. // ExecCmd 执行指定命令
  31. func ExecCmd(cmdName string, arg ...string) (stdOut, errOut string, err error) {
  32. ///etc/scripts/sysinfo.sh 会不断刷新
  33. if cmdName != "/etc/scripts/sysinfo.sh" {
  34. lfshook.NewLogger().Infof("ExecCmd cmd %s %s", cmdName, arg)
  35. }
  36. cmd := exec.Command(cmdName, arg...)
  37. var stdout, stderr bytes.Buffer
  38. cmd.Stdout = &stdout
  39. cmd.Stderr = &stderr
  40. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  41. defer cancel()
  42. err = cmd.Start()
  43. if err != nil {
  44. lfshook.NewLogger().Error(err)
  45. return "", "", err
  46. }
  47. go func() {
  48. err = cmd.Wait()
  49. if err != nil {
  50. lfshook.NewLogger().Errorf("cmd.Wait(%s) %s\n", cmdName, err)
  51. }
  52. cancel()
  53. }()
  54. <-ctx.Done()
  55. outStr, errStr := stdout.String(), stderr.String()
  56. if len(outStr) > 0 {
  57. lfshook.NewLogger().Debugf("cmd.Start(%s) %s", cmdName, outStr)
  58. }
  59. if len(errStr) > 0 {
  60. lfshook.NewLogger().Errorf("cmd.Start(%s)%s", cmdName, errStr)
  61. }
  62. return strings.TrimSpace(outStr), errStr, err
  63. }
  64. func Reboot(sleep time.Duration) {
  65. go func() {
  66. time.Sleep(sleep * time.Second)
  67. cmd := "/sbin/reboot"
  68. output, _ := exec.Command("bash", "-c", cmd).CombinedOutput()
  69. lfshook.NewLogger().Info(cmd)
  70. lfshook.NewLogger().Info(string(output))
  71. }()
  72. }
  73. func RunCmd(cmd string) (output []byte, err error) {
  74. lfshook.NewLogger().Debug(cmd)
  75. output, err = exec.Command("bash", "-c", cmd).CombinedOutput()
  76. lfshook.NewLogger().Debug("command res:", string(output), "\n")
  77. if err != nil {
  78. lfshook.NewLogger().Error(err)
  79. }
  80. return
  81. }