cli: Backtrace on SIGUSR1

Rework the signal handling code so that if debug is enabled and a
`SIGUSR1` signal is received, backtrace to the system log but continue
to run.

Added some basic tests for the signal handling code.

Fixes #241.

Signed-off-by: James O. D. Hunt <james.o.hunt@intel.com>
This commit is contained in:
James O. D. Hunt
2018-04-23 15:23:30 +01:00
parent fc8d913713
commit 6191ddffb3
4 changed files with 166 additions and 9 deletions

View File

@@ -7,6 +7,7 @@
package main
import (
"errors"
"fmt"
"io"
"os"
@@ -52,6 +53,8 @@ var kataLog *logrus.Entry
// required.
var originalLoggerLevel logrus.Level
var debug = false
// if true, coredump when an internal error occurs or a fatal signal is received
var crashOnError = false
@@ -156,18 +159,27 @@ func init() {
func setupSignalHandler() {
sigCh := make(chan os.Signal, 8)
for _, sig := range fatalSignals() {
for _, sig := range handledSignals() {
signal.Notify(sigCh, sig)
}
go func() {
sig := <-sigCh
for {
sig := <-sigCh
nativeSignal, ok := sig.(syscall.Signal)
if !ok {
err := errors.New("unknown signal")
kataLog.WithError(err).WithField("signal", sig.String()).Error()
continue
}
nativeSignal, ok := sig.(syscall.Signal)
if ok {
if fatalSignal(nativeSignal) {
kataLog.WithField("signal", sig).Error("received fatal signal")
die()
} else if debug && nonFatalSignal(nativeSignal) {
kataLog.WithField("signal", sig).Debug("handling signal")
backtrace()
}
}
}()