mirror of
				https://github.com/opencontainers/runc.git
				synced 2025-10-31 19:13:12 +08:00 
			
		
		
		
	 f8ad20f500
			
		
	
	f8ad20f500
	
	
	
		
			
			As of previous commit, this is implied in a particular scenario. In fact, this is the one and only scenario that justifies the use of -a. Drop the option from the documentation. For backward compatibility, do recognize it, and retain the feature of ignoring the "container is stopped" error when set. Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
		
			
				
	
	
		
			78 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"fmt"
 | |
| 	"strconv"
 | |
| 	"strings"
 | |
| 
 | |
| 	"github.com/opencontainers/runc/libcontainer"
 | |
| 	"github.com/urfave/cli"
 | |
| 	"golang.org/x/sys/unix"
 | |
| )
 | |
| 
 | |
| var killCommand = cli.Command{
 | |
| 	Name:  "kill",
 | |
| 	Usage: "kill sends the specified signal (default: SIGTERM) to the container's init process",
 | |
| 	ArgsUsage: `<container-id> [signal]
 | |
| 
 | |
| Where "<container-id>" is the name for the instance of the container and
 | |
| "[signal]" is the signal to be sent to the init process.
 | |
| 
 | |
| EXAMPLE:
 | |
| For example, if the container id is "ubuntu01" the following will send a "KILL"
 | |
| signal to the init process of the "ubuntu01" container:
 | |
| 
 | |
|        # runc kill ubuntu01 KILL`,
 | |
| 	Flags: []cli.Flag{
 | |
| 		cli.BoolFlag{
 | |
| 			Name:   "all, a",
 | |
| 			Usage:  "(obsoleted, do not use)",
 | |
| 			Hidden: true,
 | |
| 		},
 | |
| 	},
 | |
| 	Action: func(context *cli.Context) error {
 | |
| 		if err := checkArgs(context, 1, minArgs); err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 		if err := checkArgs(context, 2, maxArgs); err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 		container, err := getContainer(context)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 
 | |
| 		sigstr := context.Args().Get(1)
 | |
| 		if sigstr == "" {
 | |
| 			sigstr = "SIGTERM"
 | |
| 		}
 | |
| 
 | |
| 		signal, err := parseSignal(sigstr)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 		err = container.Signal(signal)
 | |
| 		if errors.Is(err, libcontainer.ErrNotRunning) && context.Bool("all") {
 | |
| 			err = nil
 | |
| 		}
 | |
| 		return err
 | |
| 	},
 | |
| }
 | |
| 
 | |
| func parseSignal(rawSignal string) (unix.Signal, error) {
 | |
| 	s, err := strconv.Atoi(rawSignal)
 | |
| 	if err == nil {
 | |
| 		return unix.Signal(s), nil
 | |
| 	}
 | |
| 	sig := strings.ToUpper(rawSignal)
 | |
| 	if !strings.HasPrefix(sig, "SIG") {
 | |
| 		sig = "SIG" + sig
 | |
| 	}
 | |
| 	signal := unix.SignalNum(sig)
 | |
| 	if signal == 0 {
 | |
| 		return -1, fmt.Errorf("unknown signal %q", rawSignal)
 | |
| 	}
 | |
| 	return signal, nil
 | |
| }
 |