46 lines
940 B
Go
46 lines
940 B
Go
package util
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
"time"
|
|
|
|
"gitlab.guxuan.icu/jinshan_community/pkg/logging"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// The Run function sets up a signal handler and executes a handler function until a termination signal
|
|
// is received.
|
|
func Run(ctx context.Context, handler func(ctx context.Context) (func(), error)) error {
|
|
state := 1
|
|
sc := make(chan os.Signal, 1)
|
|
signal.Notify(sc, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
|
|
cleanFn, err := handler(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
EXIT:
|
|
for {
|
|
sig := <-sc
|
|
logging.Context(ctx).Info("Received signal", zap.String("signal", sig.String()))
|
|
|
|
switch sig {
|
|
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
|
|
state = 0
|
|
break EXIT
|
|
case syscall.SIGHUP:
|
|
default:
|
|
break EXIT
|
|
}
|
|
}
|
|
|
|
cleanFn()
|
|
logging.Context(ctx).Info("Server exit, bye...")
|
|
time.Sleep(time.Millisecond * 100)
|
|
os.Exit(state)
|
|
return nil
|
|
}
|