func (d *driver) Terminate(p *execdriver.Command) error { // lets check the start time for the process state, err := libcontainer.GetState(filepath.Join(d.root, p.ID)) if err != nil { if !os.IsNotExist(err) { return err } // TODO: Remove this part for version 1.2.0 // This is added only to ensure smooth upgrades from pre 1.1.0 to 1.1.0 data, err := ioutil.ReadFile(filepath.Join(d.root, p.ID, "start")) if err != nil { // if we don't have the data on disk then we can assume the process is gone // because this is only removed after we know the process has stopped if os.IsNotExist(err) { return nil } return err } state = &libcontainer.State{InitStartTime: string(data)} } currentStartTime, err := system.GetProcessStartTime(p.Process.Pid) if err != nil { return err } if state.InitStartTime == currentStartTime { err = syscall.Kill(p.Process.Pid, 9) syscall.Wait4(p.Process.Pid, nil, 0, nil) } d.removeContainerRoot(p.ID) return err }
// IsRunning is determined by looking for the // pid file for a container. If the file exists then the // container is currently running func (i *info) IsRunning() bool { if _, err := libcontainer.GetState(filepath.Join(i.driver.root, i.ID)); err == nil { return true } // TODO: Remove this part for version 1.2.0 // This is added only to ensure smooth upgrades from pre 1.1.0 to 1.1.0 if _, err := os.Stat(filepath.Join(i.driver.root, i.ID, "pid")); err == nil { return true } return false }
func statsAction(context *cli.Context) { container, err := loadConfig() if err != nil { log.Fatal(err) } state, err := libcontainer.GetState(dataPath) if err != nil { log.Fatal(err) } stats, err := libcontainer.GetStats(container, state) if err != nil { log.Fatal(err) } data, err := json.MarshalIndent(stats, "", "\t") if err != nil { log.Fatal(err) } fmt.Printf("%s", data) }
func execAction(context *cli.Context) { if context.Bool("list") { w := tabwriter.NewWriter(os.Stdout, 10, 1, 3, ' ', 0) fmt.Fprint(w, "NAME\tUSAGE\n") for k, f := range argvs { fmt.Fprintf(w, "%s\t%s\n", k, f.Usage) } w.Flush() return } var exitCode int container, err := loadConfig() if err != nil { log.Fatal(err) } state, err := libcontainer.GetState(dataPath) if err != nil && !os.IsNotExist(err) { log.Fatalf("unable to read state.json: %s", err) } if state != nil { exitCode, err = startInExistingContainer(container, state, context.String("func"), context) } else { exitCode, err = startContainer(container, dataPath, []string(context.Args())) } if err != nil { log.Fatalf("failed to exec: %s", err) } os.Exit(exitCode) }