| // +build linux |
| |
| package main |
| |
| import ( |
| "fmt" |
| "strconv" |
| "strings" |
| "syscall" |
| |
| "github.com/codegangsta/cli" |
| ) |
| |
| var signalMap = map[string]syscall.Signal{ |
| "ABRT": syscall.SIGABRT, |
| "ALRM": syscall.SIGALRM, |
| "BUS": syscall.SIGBUS, |
| "CHLD": syscall.SIGCHLD, |
| "CLD": syscall.SIGCLD, |
| "CONT": syscall.SIGCONT, |
| "FPE": syscall.SIGFPE, |
| "HUP": syscall.SIGHUP, |
| "ILL": syscall.SIGILL, |
| "INT": syscall.SIGINT, |
| "IO": syscall.SIGIO, |
| "IOT": syscall.SIGIOT, |
| "KILL": syscall.SIGKILL, |
| "PIPE": syscall.SIGPIPE, |
| "POLL": syscall.SIGPOLL, |
| "PROF": syscall.SIGPROF, |
| "PWR": syscall.SIGPWR, |
| "QUIT": syscall.SIGQUIT, |
| "SEGV": syscall.SIGSEGV, |
| "STKFLT": syscall.SIGSTKFLT, |
| "STOP": syscall.SIGSTOP, |
| "SYS": syscall.SIGSYS, |
| "TERM": syscall.SIGTERM, |
| "TRAP": syscall.SIGTRAP, |
| "TSTP": syscall.SIGTSTP, |
| "TTIN": syscall.SIGTTIN, |
| "TTOU": syscall.SIGTTOU, |
| "UNUSED": syscall.SIGUNUSED, |
| "URG": syscall.SIGURG, |
| "USR1": syscall.SIGUSR1, |
| "USR2": syscall.SIGUSR2, |
| "VTALRM": syscall.SIGVTALRM, |
| "WINCH": syscall.SIGWINCH, |
| "XCPU": syscall.SIGXCPU, |
| "XFSZ": syscall.SIGXFSZ, |
| } |
| |
| var killCommand = cli.Command{ |
| Name: "kill", |
| Usage: "kill sends the specified signal (default: SIGTERM) to the container's init process", |
| Action: func(context *cli.Context) { |
| container, err := getContainer(context) |
| if err != nil { |
| fatal(err) |
| } |
| |
| sigstr := context.Args().First() |
| if sigstr == "" { |
| sigstr = "SIGTERM" |
| } |
| |
| signal, err := parseSignal(sigstr) |
| if err != nil { |
| fatal(err) |
| } |
| |
| if err := container.Signal(signal); err != nil { |
| fatal(err) |
| } |
| }, |
| } |
| |
| func parseSignal(rawSignal string) (syscall.Signal, error) { |
| s, err := strconv.Atoi(rawSignal) |
| if err == nil { |
| return syscall.Signal(s), nil |
| } |
| signal, ok := signalMap[strings.TrimPrefix(strings.ToUpper(rawSignal), "SIG")] |
| if !ok { |
| return -1, fmt.Errorf("unknown signal %q", rawSignal) |
| } |
| return signal, nil |
| } |