diff --git a/backend.go b/backend.go index 2a9ac02..19b260f 100644 --- a/backend.go +++ b/backend.go @@ -23,7 +23,10 @@ import ( "net/rpc" "os" "os/exec" + "os/signal" "strings" + "sync" + "syscall" "humungus.tedunangst.com/r/webs/gate" "humungus.tedunangst.com/r/webs/image" @@ -112,6 +115,7 @@ func orphancheck() { func backendServer() { dlog.Printf("backend server running") go orphancheck() + signal.Ignore(syscall.SIGINT) shrinker := new(Shrinker) srv := rpc.NewServer() err := srv.Register(shrinker) @@ -152,9 +156,23 @@ func runBackendServer() { if err != nil { elog.Panicf("can't exec backend: %s", err) } + workinprogress++ + var mtx sync.Mutex + go func() { + <-endoftheworld + mtx.Lock() + defer mtx.Unlock() + w.Close() + w = nil + readyalready <- true + }() go func() { proc.Wait() - elog.Printf("lost the backend: %s", err) - w.Close() + mtx.Lock() + defer mtx.Unlock() + if w != nil { + elog.Printf("lost the backend: %s", err) + w.Close() + } }() } diff --git a/web.go b/web.go index 07bd695..65c5f36 100644 --- a/web.go +++ b/web.go @@ -2556,7 +2556,7 @@ var workinprogress = 0 func enditall() { sig := make(chan os.Signal) - signal.Notify(sig, os.Interrupt, syscall.SIGTERM, syscall.SIGQUIT) + signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) <-sig ilog.Printf("stopping...") for i := 0; i < workinprogress; i++ {