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.
65 lines
1.3 KiB
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
|
|
}
|