github.com/zhuohuang-hust/src-cbuild@v0.0.0-20230105071821-c7aab3e7c840/mergeCode/runc/kill.go (about)

     1  // +build linux
     2  
     3  package main
     4  
     5  import (
     6  	"fmt"
     7  	"strconv"
     8  	"strings"
     9  	"syscall"
    10  
    11  	"github.com/urfave/cli"
    12  )
    13  
    14  var signalMap = map[string]syscall.Signal{
    15  	"ABRT":   syscall.SIGABRT,
    16  	"ALRM":   syscall.SIGALRM,
    17  	"BUS":    syscall.SIGBUS,
    18  	"CHLD":   syscall.SIGCHLD,
    19  	"CLD":    syscall.SIGCLD,
    20  	"CONT":   syscall.SIGCONT,
    21  	"FPE":    syscall.SIGFPE,
    22  	"HUP":    syscall.SIGHUP,
    23  	"ILL":    syscall.SIGILL,
    24  	"INT":    syscall.SIGINT,
    25  	"IO":     syscall.SIGIO,
    26  	"IOT":    syscall.SIGIOT,
    27  	"KILL":   syscall.SIGKILL,
    28  	"PIPE":   syscall.SIGPIPE,
    29  	"POLL":   syscall.SIGPOLL,
    30  	"PROF":   syscall.SIGPROF,
    31  	"PWR":    syscall.SIGPWR,
    32  	"QUIT":   syscall.SIGQUIT,
    33  	"SEGV":   syscall.SIGSEGV,
    34  	"STKFLT": syscall.SIGSTKFLT,
    35  	"STOP":   syscall.SIGSTOP,
    36  	"SYS":    syscall.SIGSYS,
    37  	"TERM":   syscall.SIGTERM,
    38  	"TRAP":   syscall.SIGTRAP,
    39  	"TSTP":   syscall.SIGTSTP,
    40  	"TTIN":   syscall.SIGTTIN,
    41  	"TTOU":   syscall.SIGTTOU,
    42  	"UNUSED": syscall.SIGUNUSED,
    43  	"URG":    syscall.SIGURG,
    44  	"USR1":   syscall.SIGUSR1,
    45  	"USR2":   syscall.SIGUSR2,
    46  	"VTALRM": syscall.SIGVTALRM,
    47  	"WINCH":  syscall.SIGWINCH,
    48  	"XCPU":   syscall.SIGXCPU,
    49  	"XFSZ":   syscall.SIGXFSZ,
    50  }
    51  
    52  var killCommand = cli.Command{
    53  	Name:  "kill",
    54  	Usage: "kill sends the specified signal (default: SIGTERM) to the container's init process",
    55  	ArgsUsage: `<container-id> <signal>
    56  
    57  Where "<container-id>" is the name for the instance of the container and
    58  "<signal>" is the signal to be sent to the init process.
    59  
    60  EXAMPLE:
    61  For example, if the container id is "ubuntu01" the following will send a "KILL"
    62  signal to the init process of the "ubuntu01" container:
    63  	 
    64         # runc kill ubuntu01 KILL`,
    65  	Flags: []cli.Flag{
    66  		cli.BoolFlag{
    67  			Name:  "all, a",
    68  			Usage: "send the specified signal to all processes inside the container",
    69  		},
    70  	},
    71  	Action: func(context *cli.Context) error {
    72  		container, err := getContainer(context)
    73  		if err != nil {
    74  			return err
    75  		}
    76  
    77  		sigstr := context.Args().Get(1)
    78  		if sigstr == "" {
    79  			sigstr = "SIGTERM"
    80  		}
    81  
    82  		signal, err := parseSignal(sigstr)
    83  		if err != nil {
    84  			return err
    85  		}
    86  		if err := container.Signal(signal, context.Bool("all")); err != nil {
    87  			return err
    88  		}
    89  		return nil
    90  	},
    91  }
    92  
    93  func parseSignal(rawSignal string) (syscall.Signal, error) {
    94  	s, err := strconv.Atoi(rawSignal)
    95  	if err == nil {
    96  		sig := syscall.Signal(s)
    97  		for _, msig := range signalMap {
    98  			if sig == msig {
    99  				return sig, nil
   100  			}
   101  		}
   102  		return -1, fmt.Errorf("unknown signal %q", rawSignal)
   103  	}
   104  	signal, ok := signalMap[strings.TrimPrefix(strings.ToUpper(rawSignal), "SIG")]
   105  	if !ok {
   106  		return -1, fmt.Errorf("unknown signal %q", rawSignal)
   107  	}
   108  	return signal, nil
   109  }