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 }