github.com/nsqio/nsq@v1.3.0/apps/nsqd/main.go (about)

     1  package main
     2  
     3  import (
     4  	"context"
     5  	"flag"
     6  	"fmt"
     7  	"math/rand"
     8  	"os"
     9  	"sync"
    10  	"syscall"
    11  	"time"
    12  
    13  	"github.com/BurntSushi/toml"
    14  	"github.com/judwhite/go-svc"
    15  	"github.com/mreiferson/go-options"
    16  	"github.com/nsqio/nsq/internal/lg"
    17  	"github.com/nsqio/nsq/internal/version"
    18  	"github.com/nsqio/nsq/nsqd"
    19  )
    20  
    21  type program struct {
    22  	once sync.Once
    23  	nsqd *nsqd.NSQD
    24  }
    25  
    26  func main() {
    27  	prg := &program{}
    28  	if err := svc.Run(prg, syscall.SIGINT, syscall.SIGTERM); err != nil {
    29  		logFatal("%s", err)
    30  	}
    31  }
    32  
    33  func (p *program) Init(env svc.Environment) error {
    34  	opts := nsqd.NewOptions()
    35  
    36  	flagSet := nsqdFlagSet(opts)
    37  	flagSet.Parse(os.Args[1:])
    38  
    39  	rand.Seed(time.Now().UTC().UnixNano())
    40  
    41  	if flagSet.Lookup("version").Value.(flag.Getter).Get().(bool) {
    42  		fmt.Println(version.String("nsqd"))
    43  		os.Exit(0)
    44  	}
    45  
    46  	var cfg config
    47  	configFile := flagSet.Lookup("config").Value.String()
    48  	if configFile != "" {
    49  		_, err := toml.DecodeFile(configFile, &cfg)
    50  		if err != nil {
    51  			logFatal("failed to load config file %s - %s", configFile, err)
    52  		}
    53  	}
    54  	cfg.Validate()
    55  
    56  	options.Resolve(opts, flagSet, cfg)
    57  
    58  	nsqd, err := nsqd.New(opts)
    59  	if err != nil {
    60  		logFatal("failed to instantiate nsqd - %s", err)
    61  	}
    62  	p.nsqd = nsqd
    63  
    64  	return nil
    65  }
    66  
    67  func (p *program) Start() error {
    68  	err := p.nsqd.LoadMetadata()
    69  	if err != nil {
    70  		logFatal("failed to load metadata - %s", err)
    71  	}
    72  	err = p.nsqd.PersistMetadata()
    73  	if err != nil {
    74  		logFatal("failed to persist metadata - %s", err)
    75  	}
    76  
    77  	go func() {
    78  		err := p.nsqd.Main()
    79  		if err != nil {
    80  			p.Stop()
    81  			os.Exit(1)
    82  		}
    83  	}()
    84  
    85  	return nil
    86  }
    87  
    88  func (p *program) Stop() error {
    89  	p.once.Do(func() {
    90  		p.nsqd.Exit()
    91  	})
    92  	return nil
    93  }
    94  
    95  func (p *program) Handle(s os.Signal) error {
    96  	return svc.ErrStop
    97  }
    98  
    99  // Context returns a context that will be canceled when nsqd initiates the shutdown
   100  func (p *program) Context() context.Context {
   101  	return p.nsqd.Context()
   102  }
   103  
   104  func logFatal(f string, args ...interface{}) {
   105  	lg.LogFatal("[nsqd] ", f, args...)
   106  }