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 }