| package main |
| |
| import ( |
| "io" |
| "log" |
| "os" |
| "os/exec" |
| "time" |
| ) |
| |
| const DOCKER_PATH = "/home/creack/dotcloud/docker/docker/docker" |
| |
| func runDaemon() (*exec.Cmd, error) { |
| os.Remove("/var/run/docker.pid") |
| cmd := exec.Command(DOCKER_PATH, "-d") |
| outPipe, err := cmd.StdoutPipe() |
| if err != nil { |
| return nil, err |
| } |
| errPipe, err := cmd.StderrPipe() |
| if err != nil { |
| return nil, err |
| } |
| if err := cmd.Start(); err != nil { |
| return nil, err |
| } |
| go func() { |
| io.Copy(os.Stdout, outPipe) |
| }() |
| go func() { |
| io.Copy(os.Stderr, errPipe) |
| }() |
| return cmd, nil |
| } |
| |
| func crashTest() error { |
| if err := exec.Command("/bin/bash", "-c", "while true; do true; done").Start(); err != nil { |
| return err |
| } |
| |
| for { |
| daemon, err := runDaemon() |
| if err != nil { |
| return err |
| } |
| // time.Sleep(5000 * time.Millisecond) |
| var stop bool |
| go func() error { |
| stop = false |
| for i := 0; i < 100 && !stop; i++ { |
| func() error { |
| cmd := exec.Command(DOCKER_PATH, "run", "base", "echo", "hello", "world") |
| log.Printf("%d", i) |
| outPipe, err := cmd.StdoutPipe() |
| if err != nil { |
| return err |
| } |
| inPipe, err := cmd.StdinPipe() |
| if err != nil { |
| return err |
| } |
| if err := cmd.Start(); err != nil { |
| return err |
| } |
| go func() { |
| io.Copy(os.Stdout, outPipe) |
| }() |
| // Expecting error, do not check |
| inPipe.Write([]byte("hello world!!!!!\n")) |
| go inPipe.Write([]byte("hello world!!!!!\n")) |
| go inPipe.Write([]byte("hello world!!!!!\n")) |
| inPipe.Close() |
| |
| if err := cmd.Wait(); err != nil { |
| return err |
| } |
| outPipe.Close() |
| return nil |
| }() |
| } |
| return nil |
| }() |
| time.Sleep(20 * time.Second) |
| stop = true |
| if err := daemon.Process.Kill(); err != nil { |
| return err |
| } |
| } |
| return nil |
| } |
| |
| func main() { |
| if err := crashTest(); err != nil { |
| log.Println(err) |
| } |
| } |