func main() { // prepare the configuration config, err := InitConfig() if err != nil { log.Error(err) return } // make PID file if config.Pid != "" { p, err := pid.New(config.Pid) if err != nil { log.Error(err) return } defer p.Close() } log.Message("Starting...") if config.Ca != "" || config.Cert != "" || config.Key != "" { log.Messagef("Setting TLS (CA=%s; Cert=%s; Key=%s)...", config.Ca, config.Cert, config.Key) } g, err := gleam.New(config.Etcd, config.Script, config.Cert, config.Key, config.Ca) if err != nil { log.Error(err) return } defer g.Close() g.ErrHandler = func(err error) { log.Error(err) } log.Messagef("Watching(Name = %s)...", config.Name) g.WatchNode(config.Name) for _, r := range config.Region { log.Messagef("Watching(Region = %s)...", r) g.WatchRegion(r) } go g.Serve() // signal handler sh := signal.NewHandler() sh.Bind(os.Interrupt, func() bool { return true }) go func() { g.Wait() if err := signal.Send(os.Getpid(), os.Interrupt); err != nil { panic(err) } }() sh.Loop() log.Message("Exit!") }
func main() { log.Message("Starting ... ") defer func() { time.Sleep(time.Second) log.Message("Shutdown complate!") }() // init profiling file if *proffile != "" { log.Debugf("Open a profiling file: %s", *proffile) if err := prof.Start(*proffile); err != nil { log.Error(err) } else { defer prof.Stop() } } // init heap dumping file if *dumpfile != "" { log.Debugf("Open a heap dumping file: %s", *dumpfile) if err := prof.NewDump(*dumpfile); err != nil { log.Error(err) } else { defer prof.CloseDump() go func() { for prof.Dumping { time.Sleep(time.Duration(*dumptime) * time.Second) prof.Dump() } }() } } // init pid file log.Debugf("Open a pid file: %s", *pidfile) if pidFile, err := pid.New(*pidfile); err != nil { log.Error(err) } else { defer pidFile.Close() } w := worker.New(*joblimit) if err := w.AddServer(*gearmand); err != nil { log.Error(err) return } if err := w.AddFunc("exec", execShell, uint32(*timeout)); err != nil { log.Error(err) return } if err := w.AddFunc("execphp", execPHP, uint32(*timeout)); err != nil { log.Error(err) return } defer w.Close() go w.Work() // signal handler sh := signal.NewHandler() sh.Bind(os.Interrupt, func() bool { return true }) sh.Loop() }