This adds support for signalling a container process by pid. Signed-off-by: Evan Hazlett <ejhazlett@gmail.com> make Ps more extensible Signed-off-by: Evan Hazlett <ejhazlett@gmail.com> ps: windows support Signed-off-by: Evan Hazlett <ejhazlett@gmail.com>
		
			
				
	
	
		
			76 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	gocontext "context"
 | 
						|
 | 
						|
	"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 {
 | 
						|
		id := context.String("id")
 | 
						|
		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{
 | 
						|
			ID:     id,
 | 
						|
			Signal: uint32(signal),
 | 
						|
			PidOrAll: &execution.KillRequest_Pid{
 | 
						|
				Pid: uint32(pid),
 | 
						|
			},
 | 
						|
		}
 | 
						|
 | 
						|
		if all {
 | 
						|
			killRequest.PidOrAll = &execution.KillRequest_All{
 | 
						|
				All: true,
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		containers, err := getExecutionService(context)
 | 
						|
		if err != nil {
 | 
						|
			return err
 | 
						|
		}
 | 
						|
		_, err = containers.Kill(gocontext.Background(), killRequest)
 | 
						|
		if err != nil {
 | 
						|
			return err
 | 
						|
		}
 | 
						|
		return nil
 | 
						|
	},
 | 
						|
}
 |