mirror of
https://github.com/rclone/rclone.git
synced 2024-12-02 13:34:02 +08:00
60 lines
1.2 KiB
Go
60 lines
1.2 KiB
Go
|
package daemon
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"os"
|
||
|
"os/signal"
|
||
|
"syscall"
|
||
|
)
|
||
|
|
||
|
// ErrStop should be returned signal handler function
|
||
|
// for termination of handling signals.
|
||
|
var ErrStop = errors.New("stop serve signals")
|
||
|
|
||
|
// SignalHandlerFunc is the interface for signal handler functions.
|
||
|
type SignalHandlerFunc func(sig os.Signal) (err error)
|
||
|
|
||
|
// func SetSigHandler sets handler for the given signals.
|
||
|
// SIGTERM has the default handler, he returns ErrStop.
|
||
|
func SetSigHandler(handler SignalHandlerFunc, signals ...os.Signal) {
|
||
|
for _, sig := range signals {
|
||
|
handlers[sig] = handler
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// func ServeSignals calls handlers for system signals.
|
||
|
func ServeSignals() (err error) {
|
||
|
signals := make([]os.Signal, 0, len(handlers))
|
||
|
for sig, _ := range handlers {
|
||
|
signals = append(signals, sig)
|
||
|
}
|
||
|
|
||
|
ch := make(chan os.Signal, 8)
|
||
|
signal.Notify(ch, signals...)
|
||
|
|
||
|
for sig := range ch {
|
||
|
err = handlers[sig](sig)
|
||
|
if err != nil {
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
|
||
|
signal.Stop(ch)
|
||
|
|
||
|
if err == ErrStop {
|
||
|
err = nil
|
||
|
}
|
||
|
|
||
|
return
|
||
|
}
|
||
|
|
||
|
var handlers = make(map[os.Signal]SignalHandlerFunc)
|
||
|
|
||
|
func init() {
|
||
|
handlers[syscall.SIGTERM] = sigtermDefaultHandler
|
||
|
}
|
||
|
|
||
|
func sigtermDefaultHandler(sig os.Signal) error {
|
||
|
return ErrStop
|
||
|
}
|