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

View File

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