mirror of
https://github.com/opencontainers/runc.git
synced 2026-07-10 21:53:57 +08:00
9916b7918d
Some architectures don't have all the signals listed. (Those architectures are mips and mips64, which don't have SIGSTKFLT and SIGUNUSED. The next commit defines the map for mips and mips64.) Signed-off-by: Vladimir Stefanovic <vladimir.stefanovic@imgtec.com>
78 lines
1.7 KiB
Go
78 lines
1.7 KiB
Go
// +build linux
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
"syscall"
|
|
|
|
"github.com/urfave/cli"
|
|
)
|
|
|
|
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: "send the specified signal to all processes inside the container",
|
|
},
|
|
},
|
|
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
|
|
}
|
|
if err := container.Signal(signal, context.Bool("all")); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
},
|
|
}
|
|
|
|
func parseSignal(rawSignal string) (syscall.Signal, error) {
|
|
s, err := strconv.Atoi(rawSignal)
|
|
if err == nil {
|
|
sig := syscall.Signal(s)
|
|
for _, msig := range signalMap {
|
|
if sig == msig {
|
|
return sig, nil
|
|
}
|
|
}
|
|
return -1, fmt.Errorf("unknown signal %q", rawSignal)
|
|
}
|
|
signal, ok := signalMap[strings.TrimPrefix(strings.ToUpper(rawSignal), "SIG")]
|
|
if !ok {
|
|
return -1, fmt.Errorf("unknown signal %q", rawSignal)
|
|
}
|
|
return signal, nil
|
|
}
|