better handling of os signals

This commit is contained in:
Chris Lu 2014-05-13 15:04:04 -07:00
parent 029923329d
commit dac95464b8
5 changed files with 46 additions and 32 deletions

View file

@ -11,7 +11,6 @@ import (
"code.google.com/p/weed-fs/go/util"
"fmt"
"os"
"os/signal"
"runtime"
)
@ -28,16 +27,10 @@ func runMount(cmd *Command, args []string) bool {
return false
}
signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan, os.Interrupt, os.Kill)
go func() {
for _ = range signalChan {
// sig is a ^C, handle it
fuse.Unmount(*mountOptions.dir)
c.Close()
os.Exit(0)
}
}()
OnInterrupt(func() {
fuse.Unmount(*mountOptions.dir)
c.Close()
})
err = fs.Serve(c, WFS{})
if err != nil {

View file

@ -7,7 +7,6 @@ import (
"github.com/gorilla/mux"
"net/http"
"os"
"os/signal"
"runtime"
"runtime/pprof"
"strconv"
@ -218,16 +217,10 @@ func runServer(cmd *Command, args []string) bool {
glog.Fatalf(e.Error())
}
// deal with control+c
signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan, os.Interrupt, os.Kill)
go func() {
for _ = range signalChan {
volumeServer.Shutdown()
pprof.StopCPUProfile()
os.Exit(0)
}
}()
OnInterrupt(func() {
volumeServer.Shutdown()
pprof.StopCPUProfile()
})
if e := http.Serve(volumeListener, r); e != nil {
glog.Fatalf("Fail to serve:%s", e.Error())

View file

@ -0,0 +1,27 @@
// +build !plan9
package main
import (
"os"
"os/signal"
"syscall"
)
func OnInterrupt(fn func()) {
// deal with control+c,etc
signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan,
os.Interrupt,
os.Kill,
syscall.SIGHUP,
syscall.SIGINT,
syscall.SIGTERM,
syscall.SIGQUIT)
go func() {
for _ = range signalChan {
fn()
os.Exit(0)
}
}()
}

View file

@ -0,0 +1,8 @@
// +build plan9
package main
import ()
func OnInterrupt(fn func()) {
}

View file

@ -6,7 +6,6 @@ import (
"code.google.com/p/weed-fs/go/weed/weed_server"
"net/http"
"os"
"os/signal"
"runtime"
"strconv"
"strings"
@ -92,15 +91,9 @@ func runVolume(cmd *Command, args []string) bool {
glog.Fatalf(e.Error())
}
// deal with control+c
signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan, os.Interrupt, os.Kill)
go func() {
for _ = range signalChan {
volumeServer.Shutdown()
os.Exit(0)
}
}()
OnInterrupt(func() {
volumeServer.Shutdown()
})
if e := http.Serve(listener, r); e != nil {
glog.Fatalf("Fail to serve:%s", e.Error())