crashTest.go 1.8 KB

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