github.com/hy3/cuto@v0.9.8-0.20160830082821-aa6652f877b7/servant/servant.go (about) 1 // Copyright 2015 unirita Inc. 2 // Created 2015/04/10 shanxia 3 4 package main 5 6 import ( 7 "os" 8 "os/signal" 9 "syscall" 10 11 "github.com/unirita/cuto/log" 12 "github.com/unirita/cuto/servant/config" 13 "github.com/unirita/cuto/servant/remote" 14 ) 15 16 var isTest bool = false 17 var eventLoopFunc = eventLoop 18 19 // サーバントメインルーチン 20 func Run() (int, error) { 21 // セッションの用意 22 sq, err := remote.StartReceive(config.Servant.Sys.BindAddress, config.Servant.Sys.BindPort, config.Servant.Job.MultiProc) 23 if err != nil { 24 return -1, err 25 } 26 27 // OSシグナル受信用チャネル、SIGTERMとSIGHUPに対応する 28 signalCh := make(chan os.Signal) 29 signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP) 30 31 eventLoopFunc(signalCh, sq) 32 return 0, nil 33 } 34 35 func eventLoop(signalCh <-chan os.Signal, sq <-chan *remote.Session) { 36 for { 37 select { 38 case ch := <-signalCh: // OSからシグナルキャッチ 39 if isEnd := isEndSig(ch); isEnd { 40 return 41 } 42 case session := <-sq: // マスタからの要求受信 43 go session.Do(config.Servant) 44 if isTest { 45 return 46 } 47 } 48 } 49 } 50 51 func isEndSig(sig os.Signal) bool { 52 log.Info("Receive Signal : ", sig) 53 if sig == syscall.SIGHUP { 54 // ハングアップ? 55 config.ReloadConfig() 56 } else if sig == syscall.SIGTERM || sig == syscall.SIGINT { 57 // 終了シグナル 58 return true 59 } 60 return false 61 }