From 4cb32ef9dcc9cda6ec0320a3fc4e429481eb1b08 Mon Sep 17 00:00:00 2001 From: Quentin McGaw Date: Sun, 19 Apr 2020 20:10:48 +0000 Subject: [PATCH] Reliably wait for all processes to exit --- cmd/main.go | 27 +++++++++++---------------- go.mod | 2 +- go.sum | 8 ++------ 3 files changed, 14 insertions(+), 23 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index d9379000..d22ba9df 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -133,6 +133,7 @@ func main() { e.FatalOnError(err) }() + waiter := command.NewWaiter() if allSettings.DNS.Enabled { initialDNSToUse := constants.DNSProviderMapping()[allSettings.DNS.Providers[0]] dnsConf.UseDNSInternally(initialDNSToUse.IPs[0]) @@ -144,9 +145,7 @@ func main() { e.FatalOnError(err) stream, waitFn, err := dnsConf.Start(ctx, allSettings.DNS.VerbosityDetailsLevel) e.FatalOnError(err) - go func() { - e.FatalOnError(waitFn()) - }() + waiter.Add(waitFn) go streamMerger.Merge(stream, command.MergeName("unbound")) dnsConf.UseDNSInternally(net.IP{127, 0, 0, 1}) // use Unbound err = dnsConf.UseDNSSystemWide(net.IP{127, 0, 0, 1}) // use Unbound @@ -235,11 +234,7 @@ func main() { e.FatalOnError(err) stream, waitFn, err := tinyProxyConf.Start(ctx) e.FatalOnError(err) - go func() { - if err := waitFn(); err != nil { - logger.Error(err) - } - }() + waiter.Add(waitFn) go streamMerger.Merge(stream, command.MergeName("tinyproxy")) } @@ -255,29 +250,29 @@ func main() { e.FatalOnError(err) stdout, stderr, waitFn, err := shadowsocksConf.Start(ctx, "0.0.0.0", allSettings.ShadowSocks.Port, allSettings.ShadowSocks.Password, allSettings.ShadowSocks.Log) e.FatalOnError(err) - go func() { - if err := waitFn(); err != nil { - logger.Error(err) - } - }() + waiter.Add(waitFn) go streamMerger.Merge(stdout, command.MergeName("shadowsocks")) go streamMerger.Merge(stderr, command.MergeName("shadowsocks error")) } stream, waitFn, err := ovpnConf.Start(ctx) e.FatalOnError(err) + waiter.Add(waitFn) go streamMerger.Merge(stream, command.MergeName("openvpn")) - go signals.WaitForExit(func(signal string) int { + signals.WaitForExit(func(signal string) int { logger.Warn("Caught OS signal %s, shutting down", signal) if allSettings.VPNSP == "pia" && allSettings.PIA.PortForwarding.Enabled { if err := piaConf.ClearPortForward(allSettings.PIA.PortForwarding.Filepath, allSettings.System.UID, allSettings.System.GID); err != nil { logger.Error(err) } } - time.Sleep(100 * time.Millisecond) // wait for other processes to exit + logger.Info("Waiting for processes to exit...") + errors := waiter.WaitForAll() + for _, err := range errors { + logger.Error(err) + } return 0 }) - e.FatalOnError(waitFn()) } func onConnected( diff --git a/go.mod b/go.mod index e806e45e..3e9d779b 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.14 require ( github.com/golang/mock v1.4.3 github.com/kyokomi/emoji v2.2.2+incompatible - github.com/qdm12/golibs v0.0.0-20200419174016-f1c612728dfa + github.com/qdm12/golibs v0.0.0-20200419200147-04dea671b563 github.com/stretchr/testify v1.5.1 golang.org/x/sys v0.0.0-20200413165638-669c56c373c4 ) diff --git a/go.sum b/go.sum index cbb28dd5..7e243862 100644 --- a/go.sum +++ b/go.sum @@ -50,8 +50,6 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kyokomi/emoji v2.2.1+incompatible h1:uP/6J5y5U0XxPh6fv8YximpVD1uMrshXG78I1+uF5SA= -github.com/kyokomi/emoji v2.2.1+incompatible/go.mod h1:mZ6aGCD7yk8j6QY6KICwnZ2pxoszVseX1DNoGtU2tBA= github.com/kyokomi/emoji v2.2.2+incompatible h1:gaQFbK2+uSxOR4iGZprJAbpmtqTrHhSdgOyIMD6Oidc= github.com/kyokomi/emoji v2.2.2+incompatible/go.mod h1:mZ6aGCD7yk8j6QY6KICwnZ2pxoszVseX1DNoGtU2tBA= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic= @@ -72,8 +70,8 @@ github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/qdm12/golibs v0.0.0-20200419174016-f1c612728dfa h1:7kFbnjnVF87U1gF3LdTYi3b63oIaUWJXv8pZvRdJoNA= -github.com/qdm12/golibs v0.0.0-20200419174016-f1c612728dfa/go.mod h1:pikkTN7g7zRuuAnERwqW1yAFq6pYmxrxpjiwGvb0Ysc= +github.com/qdm12/golibs v0.0.0-20200419200147-04dea671b563 h1:r6V5HuD76hv6IBrRg83YwoEe2txFMjSLZbuOfrbsY7k= +github.com/qdm12/golibs v0.0.0-20200419200147-04dea671b563/go.mod h1:pikkTN7g7zRuuAnERwqW1yAFq6pYmxrxpjiwGvb0Ysc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -108,8 +106,6 @@ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200409092240-59c9f1ba88fa h1:mQTN3ECqfsViCNBgq+A40vdwhkGykrrQlYe3mPj6BoU= -golang.org/x/sys v0.0.0-20200409092240-59c9f1ba88fa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4 h1:opSr2sbRXk5X5/givKrrKj9HXxFpW2sdCiP8MJSKLQY= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=