package main import ( "github.com/containerd/containerd/api/services/execution" "github.com/pkg/errors" "github.com/urfave/cli" ) var killCommand = cli.Command{ Name: "kill", Usage: "signal a container (default: SIGTERM)", Flags: []cli.Flag{ cli.StringFlag{ Name: "id", Usage: "id of the container", }, cli.IntFlag{ Name: "pid", Usage: "pid to kill", Value: 0, }, cli.BoolFlag{ Name: "all, a", Usage: "send signal to all processes inside the container", }, }, Action: func(context *cli.Context) error { var ( id = context.String("id") ctx, cancel = appContext(context) ) defer cancel() if id == "" { return errors.New("container id must be provided") } sigstr := context.Args().First() if sigstr == "" { sigstr = "SIGTERM" } signal, err := parseSignal(sigstr) if err != nil { return err } pid := context.Int("pid") all := context.Bool("all") if pid > 0 && all { return errors.New("enter a pid or all; not both") } killRequest := &execution.KillRequest{ ContainerID: id, Signal: uint32(signal), PidOrAll: &execution.KillRequest_Pid{ Pid: uint32(pid), }, } if all { killRequest.PidOrAll = &execution.KillRequest_All{ All: true, } } tasks, err := getTasksService(context) if err != nil { return err } _, err = tasks.Kill(ctx, killRequest) if err != nil { return err } return nil }, }