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  }