
This allows other packages and plugins to easily exec things without racing with the reaper. The reaper is mostly needed in the shim but can be removed in containerd in favor of the `exec.Cmd` apis Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
69 lines
1.3 KiB
Go
69 lines
1.3 KiB
Go
// +build linux darwin freebsd solaris
|
|
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"runtime"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
"golang.org/x/sys/unix"
|
|
|
|
"github.com/containerd/containerd/log"
|
|
"github.com/containerd/containerd/server"
|
|
)
|
|
|
|
const defaultConfigPath = "/etc/containerd/config.toml"
|
|
|
|
var handledSignals = []os.Signal{
|
|
unix.SIGTERM,
|
|
unix.SIGINT,
|
|
unix.SIGUSR1,
|
|
unix.SIGPIPE,
|
|
}
|
|
|
|
func handleSignals(ctx context.Context, signals chan os.Signal, serverC chan *server.Server) chan struct{} {
|
|
done := make(chan struct{}, 1)
|
|
go func() {
|
|
var server *server.Server
|
|
for {
|
|
select {
|
|
case s := <-serverC:
|
|
server = s
|
|
case s := <-signals:
|
|
log.G(ctx).WithField("signal", s).Debug("received signal")
|
|
switch s {
|
|
case unix.SIGUSR1:
|
|
dumpStacks()
|
|
case unix.SIGPIPE:
|
|
continue
|
|
default:
|
|
if server == nil {
|
|
close(done)
|
|
return
|
|
}
|
|
server.Stop()
|
|
close(done)
|
|
}
|
|
}
|
|
}
|
|
}()
|
|
return done
|
|
}
|
|
|
|
func dumpStacks() {
|
|
var (
|
|
buf []byte
|
|
stackSize int
|
|
)
|
|
bufferLen := 16384
|
|
for stackSize == len(buf) {
|
|
buf = make([]byte, bufferLen)
|
|
stackSize = runtime.Stack(buf, true)
|
|
bufferLen *= 2
|
|
}
|
|
buf = buf[:stackSize]
|
|
logrus.Infof("=== BEGIN goroutine stack dump ===\n%s\n=== END goroutine stack dump ===", buf)
|
|
}
|