Register signal handlers earlier to avoid zombies

newSignalHandler needs to be called before the process is started, otherwise when
the process exits quickly the SIGCHLD is recieved (and ignored) before the
handler is set up. When this happens the reaper never runs, the
process becomes a zombie, and the exit code isn't returned to the user.

Signed-off-by: Julian Friedman <julz.friedman@uk.ibm.com>
This commit is contained in:
Julian Friedman 2016-02-16 09:59:16 +00:00
parent e898a30e34
commit 5fbdf6c3fc
2 changed files with 5 additions and 4 deletions

View File

@ -134,6 +134,8 @@ func restoreContainer(context *cli.Context, spec *specs.LinuxSpec, config *confi
if err != nil { if err != nil {
return -1, err return -1, err
} }
handler := newSignalHandler(tty)
defer handler.Close()
if err := container.Restore(process, options); err != nil { if err := container.Restore(process, options); err != nil {
tty.Close() tty.Close()
return -1, err return -1, err
@ -149,8 +151,6 @@ func restoreContainer(context *cli.Context, spec *specs.LinuxSpec, config *confi
if detach { if detach {
return 0, nil return 0, nil
} }
handler := newSignalHandler(tty)
defer handler.Close()
return handler.forward(process) return handler.forward(process)
} }

View File

@ -307,6 +307,9 @@ func runProcess(container libcontainer.Container, config *specs.Process, listenF
return -1, err return -1, err
} }
handler := newSignalHandler(tty)
defer handler.Close()
if err := container.Start(process); err != nil { if err := container.Start(process); err != nil {
tty.Close() tty.Close()
return -1, err return -1, err
@ -323,8 +326,6 @@ func runProcess(container libcontainer.Container, config *specs.Process, listenF
if detach { if detach {
return 0, nil return 0, nil
} }
handler := newSignalHandler(tty)
defer handler.Close()
return handler.forward(process) return handler.forward(process)
} }