Update server shutdown procedure.

Ignore SIGINT, honor TOR_PT_EXIT_ON_STDIN_CLOSE.
This commit is contained in:
David Fifield 2018-03-21 00:53:31 -07:00
parent bdc1798adb
commit 019e2cea23
2 changed files with 26 additions and 14 deletions

View file

@ -5,6 +5,7 @@ import (
"flag" "flag"
"fmt" "fmt"
"io" "io"
"io/ioutil"
"log" "log"
"net" "net"
"os" "os"
@ -291,9 +292,19 @@ func main() {
var numHandlers int = 0 var numHandlers int = 0
var sig os.Signal var sig os.Signal
sigChan := make(chan os.Signal, 1) sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) signal.Notify(sigChan, syscall.SIGTERM)
// wait for first signal if os.Getenv("TOR_PT_EXIT_ON_STDIN_CLOSE") == "1" {
// This environment variable means we should treat EOF on stdin
// just like SIGTERM: https://bugs.torproject.org/15435.
go func() {
io.Copy(ioutil.Discard, os.Stdin)
log.Printf("synthesizing SIGTERM because of stdin close")
sigChan <- syscall.SIGTERM
}()
}
// keep track of handlers and wait for a signal
sig = nil sig = nil
for sig == nil { for sig == nil {
select { select {
@ -303,17 +314,7 @@ func main() {
} }
} }
if sig == syscall.SIGTERM { for numHandlers > 0 {
return numHandlers += <-handlerChan
}
// wait for second signal or no more handlers
sig = nil
for sig == nil && numHandlers != 0 {
select {
case n := <-handlerChan:
numHandlers += n
case sig = <-sigChan:
}
} }
} }

View file

@ -8,6 +8,7 @@ import (
"flag" "flag"
"fmt" "fmt"
"io" "io"
"io/ioutil"
"log" "log"
"net" "net"
"net/http" "net/http"
@ -378,6 +379,16 @@ func main() {
sigChan := make(chan os.Signal, 1) sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGTERM) signal.Notify(sigChan, syscall.SIGTERM)
if os.Getenv("TOR_PT_EXIT_ON_STDIN_CLOSE") == "1" {
// This environment variable means we should treat EOF on stdin
// just like SIGTERM: https://bugs.torproject.org/15435.
go func() {
io.Copy(ioutil.Discard, os.Stdin)
log.Printf("synthesizing SIGTERM because of stdin close")
sigChan <- syscall.SIGTERM
}()
}
// keep track of handlers and wait for a signal // keep track of handlers and wait for a signal
sig = nil sig = nil
for sig == nil { for sig == nil {