Merge pull request #22460 from jwhonce/wip/sigpipe

Ignore SIGPIPE events
This commit is contained in:
Sebastiaan van Stijn 2016-06-02 16:05:22 +02:00
commit 4d6131b729

View file

@ -18,15 +18,22 @@ import (
// * If SIGINT or SIGTERM are received 3 times before cleanup is complete, then cleanup is // * If SIGINT or SIGTERM are received 3 times before cleanup is complete, then cleanup is
// skipped and the process is terminated immediately (allows force quit of stuck daemon) // skipped and the process is terminated immediately (allows force quit of stuck daemon)
// * A SIGQUIT always causes an exit without cleanup, with a goroutine dump preceding exit. // * A SIGQUIT always causes an exit without cleanup, with a goroutine dump preceding exit.
// * Ignore SIGPIPE events. These are generated by systemd when journald is restarted while
// the docker daemon is not restarted and also running under systemd.
// Fixes https://github.com/docker/docker/issues/19728
// //
func Trap(cleanup func()) { func Trap(cleanup func()) {
c := make(chan os.Signal, 1) c := make(chan os.Signal, 1)
// we will handle INT, TERM, QUIT here // we will handle INT, TERM, QUIT, SIGPIPE here
signals := []os.Signal{os.Interrupt, syscall.SIGTERM, syscall.SIGQUIT} signals := []os.Signal{os.Interrupt, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGPIPE}
gosignal.Notify(c, signals...) gosignal.Notify(c, signals...)
go func() { go func() {
interruptCount := uint32(0) interruptCount := uint32(0)
for sig := range c { for sig := range c {
if sig == syscall.SIGPIPE {
continue
}
go func(sig os.Signal) { go func(sig os.Signal) {
logrus.Infof("Processing signal '%v'", sig) logrus.Infof("Processing signal '%v'", sig)
switch sig { switch sig {