Docker-DCO-1.1-Signed-off-by: Guillaume J. Charmes <guillaume@charmes.net> (github: creack)
| ... | ... |
@@ -540,7 +540,17 @@ func (cli *DockerCli) forwardAllSignals(cid string) chan os.Signal {
|
| 540 | 540 |
if s == syscall.SIGCHLD {
|
| 541 | 541 |
continue |
| 542 | 542 |
} |
| 543 |
- if _, _, err := readBody(cli.call("POST", fmt.Sprintf("/containers/%s/kill?signal=%d", cid, s), nil, false)); err != nil {
|
|
| 543 |
+ var sig string |
|
| 544 |
+ for sigStr, sigN := range signal.SignalMap {
|
|
| 545 |
+ if sigN == s {
|
|
| 546 |
+ sig = sigStr |
|
| 547 |
+ break |
|
| 548 |
+ } |
|
| 549 |
+ } |
|
| 550 |
+ if sig == "" {
|
|
| 551 |
+ utils.Errorf("Unsupported signal: %d. Discarding.", s)
|
|
| 552 |
+ } |
|
| 553 |
+ if _, _, err := readBody(cli.call("POST", fmt.Sprintf("/containers/%s/kill?signal=%s", cid, sig), nil, false)); err != nil {
|
|
| 544 | 554 |
utils.Debugf("Error sending signal: %s", err)
|
| 545 | 555 |
} |
| 546 | 556 |
} |
| ... | ... |
@@ -4,37 +4,37 @@ import ( |
| 4 | 4 |
"syscall" |
| 5 | 5 |
) |
| 6 | 6 |
|
| 7 |
-var signalMap = map[string]syscall.Signal{
|
|
| 8 |
- "ABRT": syscall.SIGABRT, |
|
| 9 |
- "ALRM": syscall.SIGALRM, |
|
| 10 |
- "BUG": syscall.SIGBUS, |
|
| 11 |
- "CHLD": syscall.SIGCHLD, |
|
| 12 |
- "CONT": syscall.SIGCONT, |
|
| 13 |
- "EMT": syscall.SIGEMT, |
|
| 14 |
- "FPE": syscall.SIGFPE, |
|
| 15 |
- "HUP": syscall.SIGHUP, |
|
| 16 |
- "ILL": syscall.SIGILL, |
|
| 17 |
- "INFO": syscall.SIGINFO, |
|
| 18 |
- "INT": syscall.SIGINT, |
|
| 19 |
- "IO": syscall.SIGIO, |
|
| 20 |
- "IOT": syscall.SIGIOT, |
|
| 21 |
- "KILL": syscall.SIGKILL, |
|
| 22 |
- "PIPE": syscall.SIGPIPE, |
|
| 23 |
- "PROF": syscall.SIGPROF, |
|
| 24 |
- "QUIT": syscall.SIGQUIT, |
|
| 25 |
- "SEGV": syscall.SIGSEGV, |
|
| 26 |
- "STOP": syscall.SIGSTOP, |
|
| 27 |
- "SYS": syscall.SIGSYS, |
|
| 28 |
- "TERM": syscall.SIGTERM, |
|
| 29 |
- "TRAP": syscall.SIGTRAP, |
|
| 30 |
- "TSTP": syscall.SIGTSTP, |
|
| 31 |
- "TTIN": syscall.SIGTTIN, |
|
| 32 |
- "TTOU": syscall.SIGTTOU, |
|
| 33 |
- "URG": syscall.SIGURG, |
|
| 34 |
- "USR1": syscall.SIGUSR1, |
|
| 35 |
- "USR2": syscall.SIGUSR2, |
|
| 7 |
+var SignalMap = map[string]syscall.Signal{
|
|
| 8 |
+ "ABRT": syscall.SIGABRT, |
|
| 9 |
+ "ALRM": syscall.SIGALRM, |
|
| 10 |
+ "BUG": syscall.SIGBUS, |
|
| 11 |
+ "CHLD": syscall.SIGCHLD, |
|
| 12 |
+ "CONT": syscall.SIGCONT, |
|
| 13 |
+ "EMT": syscall.SIGEMT, |
|
| 14 |
+ "FPE": syscall.SIGFPE, |
|
| 15 |
+ "HUP": syscall.SIGHUP, |
|
| 16 |
+ "ILL": syscall.SIGILL, |
|
| 17 |
+ "INFO": syscall.SIGINFO, |
|
| 18 |
+ "INT": syscall.SIGINT, |
|
| 19 |
+ "IO": syscall.SIGIO, |
|
| 20 |
+ "IOT": syscall.SIGIOT, |
|
| 21 |
+ "KILL": syscall.SIGKILL, |
|
| 22 |
+ "PIPE": syscall.SIGPIPE, |
|
| 23 |
+ "PROF": syscall.SIGPROF, |
|
| 24 |
+ "QUIT": syscall.SIGQUIT, |
|
| 25 |
+ "SEGV": syscall.SIGSEGV, |
|
| 26 |
+ "STOP": syscall.SIGSTOP, |
|
| 27 |
+ "SYS": syscall.SIGSYS, |
|
| 28 |
+ "TERM": syscall.SIGTERM, |
|
| 29 |
+ "TRAP": syscall.SIGTRAP, |
|
| 30 |
+ "TSTP": syscall.SIGTSTP, |
|
| 31 |
+ "TTIN": syscall.SIGTTIN, |
|
| 32 |
+ "TTOU": syscall.SIGTTOU, |
|
| 33 |
+ "URG": syscall.SIGURG, |
|
| 34 |
+ "USR1": syscall.SIGUSR1, |
|
| 35 |
+ "USR2": syscall.SIGUSR2, |
|
| 36 | 36 |
"VTALRM": syscall.SIGVTALRM, |
| 37 |
- "WINCH": syscall.SIGWINCH, |
|
| 38 |
- "XCPU": syscall.SIGXCPU, |
|
| 39 |
- "XFSZ": syscall.SIGXFSZ, |
|
| 37 |
+ "WINCH": syscall.SIGWINCH, |
|
| 38 |
+ "XCPU": syscall.SIGXCPU, |
|
| 39 |
+ "XFSZ": syscall.SIGXFSZ, |
|
| 40 | 40 |
} |
| ... | ... |
@@ -8,6 +8,7 @@ import ( |
| 8 | 8 |
"github.com/dotcloud/docker/dockerversion" |
| 9 | 9 |
"github.com/dotcloud/docker/engine" |
| 10 | 10 |
"github.com/dotcloud/docker/pkg/graphdb" |
| 11 |
+ "github.com/dotcloud/docker/pkg/signal" |
|
| 11 | 12 |
"github.com/dotcloud/docker/registry" |
| 12 | 13 |
"github.com/dotcloud/docker/runconfig" |
| 13 | 14 |
"github.com/dotcloud/docker/utils" |
| ... | ... |
@@ -18,7 +19,7 @@ import ( |
| 18 | 18 |
"net/url" |
| 19 | 19 |
"os" |
| 20 | 20 |
"os/exec" |
| 21 |
- "os/signal" |
|
| 21 |
+ gosignal "os/signal" |
|
| 22 | 22 |
"path" |
| 23 | 23 |
"path/filepath" |
| 24 | 24 |
"runtime" |
| ... | ... |
@@ -47,7 +48,7 @@ func InitServer(job *engine.Job) engine.Status {
|
| 47 | 47 |
} |
| 48 | 48 |
job.Logf("Setting up signal traps")
|
| 49 | 49 |
c := make(chan os.Signal, 1) |
| 50 |
- signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGQUIT) |
|
| 50 |
+ gosignal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGQUIT) |
|
| 51 | 51 |
go func() {
|
| 52 | 52 |
sig := <-c |
| 53 | 53 |
log.Printf("Received signal '%v', exiting\n", sig)
|
| ... | ... |
@@ -122,56 +123,30 @@ func (v *simpleVersionInfo) Version() string {
|
| 122 | 122 |
// for the container to exit. |
| 123 | 123 |
// If a signal is given, then just send it to the container and return. |
| 124 | 124 |
func (srv *Server) ContainerKill(job *engine.Job) engine.Status {
|
| 125 |
- signalMap := map[string]syscall.Signal{
|
|
| 126 |
- "HUP": syscall.SIGHUP, |
|
| 127 |
- "INT": syscall.SIGINT, |
|
| 128 |
- "QUIT": syscall.SIGQUIT, |
|
| 129 |
- "ILL": syscall.SIGILL, |
|
| 130 |
- "TRAP": syscall.SIGTRAP, |
|
| 131 |
- "ABRT": syscall.SIGABRT, |
|
| 132 |
- "BUS": syscall.SIGBUS, |
|
| 133 |
- "FPE": syscall.SIGFPE, |
|
| 134 |
- "KILL": syscall.SIGKILL, |
|
| 135 |
- "USR1": syscall.SIGUSR1, |
|
| 136 |
- "SEGV": syscall.SIGSEGV, |
|
| 137 |
- "USR2": syscall.SIGUSR2, |
|
| 138 |
- "PIPE": syscall.SIGPIPE, |
|
| 139 |
- "ALRM": syscall.SIGALRM, |
|
| 140 |
- "TERM": syscall.SIGTERM, |
|
| 141 |
- //"STKFLT": syscall.SIGSTKFLT, |
|
| 142 |
- "CHLD": syscall.SIGCHLD, |
|
| 143 |
- "CONT": syscall.SIGCONT, |
|
| 144 |
- "STOP": syscall.SIGSTOP, |
|
| 145 |
- "TSTP": syscall.SIGTSTP, |
|
| 146 |
- "TTIN": syscall.SIGTTIN, |
|
| 147 |
- "TTOU": syscall.SIGTTOU, |
|
| 148 |
- "URG": syscall.SIGURG, |
|
| 149 |
- "XCPU": syscall.SIGXCPU, |
|
| 150 |
- "XFSZ": syscall.SIGXFSZ, |
|
| 151 |
- "VTALRM": syscall.SIGVTALRM, |
|
| 152 |
- "PROF": syscall.SIGPROF, |
|
| 153 |
- "WINCH": syscall.SIGWINCH, |
|
| 154 |
- "IO": syscall.SIGIO, |
|
| 155 |
- //"PWR": syscall.SIGPWR, |
|
| 156 |
- "SYS": syscall.SIGSYS, |
|
| 157 |
- } |
|
| 158 |
- |
|
| 159 | 125 |
if n := len(job.Args); n < 1 || n > 2 {
|
| 160 | 126 |
return job.Errorf("Usage: %s CONTAINER [SIGNAL]", job.Name)
|
| 161 | 127 |
} |
| 162 |
- name := job.Args[0] |
|
| 163 |
- var sig uint64 |
|
| 128 |
+ var ( |
|
| 129 |
+ name = job.Args[0] |
|
| 130 |
+ sig uint64 |
|
| 131 |
+ err error |
|
| 132 |
+ ) |
|
| 133 |
+ |
|
| 134 |
+ // If we have a signal, look at it. Otherwise, do nothing |
|
| 164 | 135 |
if len(job.Args) == 2 && job.Args[1] != "" {
|
| 165 |
- sig = uint64(signalMap[job.Args[1]]) |
|
| 166 |
- if sig == 0 {
|
|
| 167 |
- var err error |
|
| 168 |
- // The largest legal signal is 31, so let's parse on 5 bits |
|
| 169 |
- sig, err = strconv.ParseUint(job.Args[1], 10, 5) |
|
| 170 |
- if err != nil {
|
|
| 136 |
+ // Check if we passed the singal as a number: |
|
| 137 |
+ // The largest legal signal is 31, so let's parse on 5 bits |
|
| 138 |
+ sig, err = strconv.ParseUint(job.Args[1], 10, 5) |
|
| 139 |
+ if err != nil {
|
|
| 140 |
+ // The signal is not a number, treat it as a string |
|
| 141 |
+ sig = uint64(signal.SignalMap[job.Args[1]]) |
|
| 142 |
+ if sig == 0 {
|
|
| 171 | 143 |
return job.Errorf("Invalid signal: %s", job.Args[1])
|
| 172 | 144 |
} |
| 145 |
+ |
|
| 173 | 146 |
} |
| 174 | 147 |
} |
| 148 |
+ |
|
| 175 | 149 |
if container := srv.runtime.Get(name); container != nil {
|
| 176 | 150 |
// If no signal is passed, or SIGKILL, perform regular Kill (SIGKILL + wait()) |
| 177 | 151 |
if sig == 0 || syscall.Signal(sig) == syscall.SIGKILL {
|