1
0

monitor.go 1015 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // +build !windows,!solaris
  2. package panicwrap
  3. import (
  4. "github.com/kardianos/osext"
  5. "os"
  6. "os/exec"
  7. )
  8. func monitor(c *WrapConfig) (int, error) {
  9. // If we're the child process, absorb panics.
  10. if Wrapped(c) {
  11. panicCh := make(chan string)
  12. go trackPanic(os.Stdin, os.Stderr, c.DetectDuration, panicCh)
  13. // Wait on the panic data
  14. panicTxt := <-panicCh
  15. if panicTxt != "" {
  16. if !c.HidePanic {
  17. os.Stderr.Write([]byte(panicTxt))
  18. }
  19. c.Handler(panicTxt)
  20. }
  21. os.Exit(0)
  22. }
  23. exePath, err := osext.Executable()
  24. if err != nil {
  25. return -1, err
  26. }
  27. cmd := exec.Command(exePath, os.Args[1:]...)
  28. read, write, err := os.Pipe()
  29. if err != nil {
  30. return -1, err
  31. }
  32. cmd.Stdin = read
  33. cmd.Stdout = os.Stdout
  34. cmd.Stderr = os.Stderr
  35. cmd.Env = append(os.Environ(), c.CookieKey+"="+c.CookieValue)
  36. if err != nil {
  37. return -1, err
  38. }
  39. err = cmd.Start()
  40. if err != nil {
  41. return -1, err
  42. }
  43. err = dup2(int(write.Fd()), int(os.Stderr.Fd()))
  44. if err != nil {
  45. return -1, err
  46. }
  47. return -1, nil
  48. }