- service stop: fix race
Service Stop handler sends SIGINT to the main thread, which begins the stops the app.
This commit is contained in:
parent
5abf0b5a53
commit
131aa4c93c
|
@ -51,6 +51,7 @@ type configuration struct {
|
||||||
// runningAsService flag is set to true when options are passed from the service runner
|
// runningAsService flag is set to true when options are passed from the service runner
|
||||||
runningAsService bool
|
runningAsService bool
|
||||||
disableUpdate bool // If set, don't check for updates
|
disableUpdate bool // If set, don't check for updates
|
||||||
|
appSignalChannel chan os.Signal
|
||||||
|
|
||||||
BindHost string `yaml:"bind_host"` // BindHost is the IP address of the HTTP server to bind to
|
BindHost string `yaml:"bind_host"` // BindHost is the IP address of the HTTP server to bind to
|
||||||
BindPort int `yaml:"bind_port"` // BindPort is the port the HTTP server
|
BindPort int `yaml:"bind_port"` // BindPort is the port the HTTP server
|
||||||
|
|
|
@ -99,10 +99,10 @@ func run(args options) {
|
||||||
requireAdminRights()
|
requireAdminRights()
|
||||||
}
|
}
|
||||||
|
|
||||||
signalChannel := make(chan os.Signal)
|
config.appSignalChannel = make(chan os.Signal)
|
||||||
signal.Notify(signalChannel, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGQUIT)
|
signal.Notify(config.appSignalChannel, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGQUIT)
|
||||||
go func() {
|
go func() {
|
||||||
<-signalChannel
|
<-config.appSignalChannel
|
||||||
cleanup()
|
cleanup()
|
||||||
cleanupAlways()
|
cleanupAlways()
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
|
|
|
@ -3,6 +3,7 @@ package home
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"syscall"
|
||||||
|
|
||||||
"github.com/AdguardTeam/golibs/log"
|
"github.com/AdguardTeam/golibs/log"
|
||||||
"github.com/kardianos/service"
|
"github.com/kardianos/service"
|
||||||
|
@ -31,9 +32,10 @@ func (p *program) Start(s service.Service) error {
|
||||||
// Stop stops the program
|
// Stop stops the program
|
||||||
func (p *program) Stop(s service.Service) error {
|
func (p *program) Stop(s service.Service) error {
|
||||||
// Stop should not block. Return with a few seconds.
|
// Stop should not block. Return with a few seconds.
|
||||||
cleanup()
|
if config.appSignalChannel == nil {
|
||||||
cleanupAlways()
|
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
config.appSignalChannel <- syscall.SIGINT
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue