crashTest.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package main
  2. import (
  3. "io"
  4. "log"
  5. "os"
  6. "os/exec"
  7. "path"
  8. "time"
  9. )
  10. var DOCKER_PATH string = path.Join(os.Getenv("DOCKERPATH"), "docker")
  11. func runDaemon() (*exec.Cmd, error) {
  12. os.Remove("/var/run/docker.pid")
  13. cmd := exec.Command(DOCKER_PATH, "-d")
  14. outPipe, err := cmd.StdoutPipe()
  15. if err != nil {
  16. return nil, err
  17. }
  18. errPipe, err := cmd.StderrPipe()
  19. if err != nil {
  20. return nil, err
  21. }
  22. if err := cmd.Start(); err != nil {
  23. return nil, err
  24. }
  25. go func() {
  26. io.Copy(os.Stdout, outPipe)
  27. }()
  28. go func() {
  29. io.Copy(os.Stderr, errPipe)
  30. }()
  31. return cmd, nil
  32. }
  33. func crashTest() error {
  34. if err := exec.Command("/bin/bash", "-c", "while true; do true; done").Start(); err != nil {
  35. return err
  36. }
  37. for {
  38. daemon, err := runDaemon()
  39. if err != nil {
  40. return err
  41. }
  42. // time.Sleep(5000 * time.Millisecond)
  43. var stop bool
  44. go func() error {
  45. stop = false
  46. for i := 0; i < 100 && !stop; i++ {
  47. func() error {
  48. cmd := exec.Command(DOCKER_PATH, "run", "base", "echo", "hello", "world")
  49. log.Printf("%d", i)
  50. outPipe, err := cmd.StdoutPipe()
  51. if err != nil {
  52. return err
  53. }
  54. inPipe, err := cmd.StdinPipe()
  55. if err != nil {
  56. return err
  57. }
  58. if err := cmd.Start(); err != nil {
  59. return err
  60. }
  61. go func() {
  62. io.Copy(os.Stdout, outPipe)
  63. }()
  64. // Expecting error, do not check
  65. inPipe.Write([]byte("hello world!!!!!\n"))
  66. go inPipe.Write([]byte("hello world!!!!!\n"))
  67. go inPipe.Write([]byte("hello world!!!!!\n"))
  68. inPipe.Close()
  69. if err := cmd.Wait(); err != nil {
  70. return err
  71. }
  72. outPipe.Close()
  73. return nil
  74. }()
  75. }
  76. return nil
  77. }()
  78. time.Sleep(20 * time.Second)
  79. stop = true
  80. if err := daemon.Process.Kill(); err != nil {
  81. return err
  82. }
  83. }
  84. return nil
  85. }
  86. func main() {
  87. if err := crashTest(); err != nil {
  88. log.Println(err)
  89. }
  90. }