You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gosuv/serv.go

65 lines
1.3 KiB

package main
import (
"fmt"
"net"
"os"
"os/signal"
"syscall"
. "github.com/codeskyblue/gosuv/config"
pb "github.com/codeskyblue/gosuv/gosuvpb"
. "github.com/codeskyblue/gosuv/utils"
"github.com/qiniu/log"
"google.golang.org/grpc"
)
func handleSignal(lis net.Listener) {
sigc := make(chan os.Signal, 2)
signal.Notify(sigc, syscall.SIGINT, syscall.SIGHUP)
go func() {
for sig := range sigc {
log.Println("Receive signal:", sig)
if sig == syscall.SIGHUP {
return // ignore, when shell session closed, gosuv will receive SIGHUP signal
}
lis.Close()
log.Println("Kill all running gosuv programs")
programTable.StopAll()
os.Exit(0)
return
}
}()
}
type PbSuvServer struct {
lis net.Listener
}
func RunGosuvService(addr string) error {
initProgramTable()
lis, err := net.Listen("unix", GOSUV_SOCK_PATH)
if err != nil {
log.Fatal(err)
}
handleSignal(lis)
pbServ := &PbSuvServer{}
pbProgram := &PbProgram{}
grpcServ := grpc.NewServer()
pb.RegisterGoSuvServer(grpcServ, pbServ) // SystemServer
pb.RegisterProgramServer(grpcServ, pbProgram) // ProcessServer
pbServ.lis = lis
select {
case err = <-GoFunc(func() error { return grpcServ.Serve(lis) }):
return fmt.Errorf("Address: %s has been used", addr)
// Start web server here
}
// grpcServ.Serve(lis)
return nil
}