in nimo-shake/main/main.go [24:101]
func main() {
defer LOG.Close()
//http.DefaultServeMux.Handle("/debug/fgprof", fgprof.Handler())
//go func() {
// http.ListenAndServe(":6060", nil)
//}()
runtime.GOMAXPROCS(256)
fmt.Println("max process:", runtime.GOMAXPROCS(0))
var err error
// argument options
configuration := flag.String("conf", "", "configuration path")
version := flag.Bool("version", false, "show version")
flag.Parse()
if *version {
fmt.Println(utils.Version)
return
}
if *configuration == "" {
fmt.Println(utils.Version)
flag.PrintDefaults()
return
}
conf.Options.Version = utils.Version
var file *os.File
if file, err = os.Open(*configuration); err != nil {
crash(fmt.Sprintf("Configure file open failed. %v", err), -1)
}
configure := nimo.NewConfigLoader(file)
configure.SetDateFormat(utils.GolangSecurityTime)
if err := configure.Load(&conf.Options); err != nil {
crash(fmt.Sprintf("Configure file %s parse failed. %v", *configuration, err), -2)
}
utils.InitialLogger(conf.Options.LogFile, conf.Options.LogLevel, conf.Options.LogBuffer)
// sanitize options
if err := sanitizeOptions(); err != nil {
crash(fmt.Sprintf("Conf.Options check failed: %s", err.Error()), -4)
}
// read fcv and do comparison
if _, err := conf.CheckFcv(*configuration, utils.FcvConfiguration.FeatureCompatibleVersion); err != nil {
crash(err.Error(), -5)
}
utils.Welcome()
utils.StartTime = fmt.Sprintf("%v", time.Now().Format(utils.GolangSecurityTime))
// write pid
if err = utils.WritePidById(conf.Options.Id, "."); err != nil {
crash(fmt.Sprintf("write pid failed. %v", err), -5)
}
// print configuration
if opts, err := json.Marshal(conf.Options); err != nil {
crash(fmt.Sprintf("marshal configuration failed[%v]", err), -6)
} else {
LOG.Info("%v configuration: %s", conf.Options.Id, string(opts))
}
nimo.Profiling(int(conf.Options.SystemProfile))
nimo.RegisterSignalForProfiling(syscall.Signal(utils.SIGNALPROFILE)) // syscall.SIGUSR2
nimo.RegisterSignalForPrintStack(syscall.Signal(utils.SIGNALSTACK), func(bytes []byte) { // syscall.SIGUSR1
LOG.Info(string(bytes))
})
run.Start()
LOG.Info("sync complete!")
}