package main import ( "analysis/logo" "analysis/util" "fmt" "os/exec" "os/signal" "runtime/debug" "strconv" "syscall" "time" "analysis/app/master" "analysis/app/slave" "context" "flag" "os" // "net/http" // _ "net/http/pprof" ) var ( logit bool role string runType string id string gpu int shm bool ruleIPC string configPath string ) const ( roleMaster = `master` roleSlave = `slave` ) func init() { flag.StringVar(&role, "role", roleMaster, "进程启动方式,master/slave") flag.StringVar(&runType, "sdk", util.FeatAll, "进程运行的算法类型FaceDetect/Yolo,etc.slave使用") flag.StringVar(&id, "id", util.FakeSdkID, "进程运行算法的ID,slave使用") flag.StringVar(&configPath, util.ConfigPath, "", "进程运行算法的参数配置文件路径,master从路径读取文件,slave使用文件") flag.BoolVar(&logit, util.LogIt, false, "是否保存日志文件,默认false") flag.BoolVar(&shm, util.SHM, false, "是否使用shared memory, 默认false, slave使用") flag.IntVar(&gpu, util.GPU, -1, "进程运行算法需要的GPU Index") // 指定获取配置信息从sqlite,有最高优先级, master使用 flag.StringVar(&util.FSI.IP, util.FetchSrvIP, util.FSI.IP, "从IP获取需要运行的SDK,master使用") flag.IntVar(&util.FSI.HBPort, util.FetchSrvHeartbeatPort, util.FSI.HBPort, "获取需要运行的SDK服务器的心跳 Port,master使用") flag.IntVar(&util.FSI.DataPort, util.FetchSrvDataPort, util.FSI.DataPort, "获取需要运行的SDK服务器的数据 Port,master使用") // 指定发送到ruleprocess的ipc地址 flag.StringVar(&util.ToRuleIPC, util.RuleIPC, util.ToRuleIPC, "将算法运行结果发送到规则服务器的IPC地址,slave使用") } func runLogger() { suffix := role + "_" + runType if logit { file := util.LogFile + suffix // + strconv.Itoa(os.Getpid()) logo.Config(file, 500, 3, 30) logo.Infoln("START LOGGER FILE: ", file) } logo.ShowConsole() } func setParamters() { // util.FillParams(util.FetchSrvIP, util.FSI.IP) // util.FillParams(util.FetchSrvHeartbeatPort, strconv.Itoa(util.FSI.HBPort)) // util.FillParams(util.FetchSrvDataPort, strconv.Itoa(util.FSI.DataPort)) util.FillParams(util.RuleIPC, util.ToRuleIPC) util.FillParams(util.GPU, strconv.Itoa(gpu)) if logit { util.FillParams(util.LogIt, "true") } if shm { util.FillParams(util.SHM, "true") } } func main() { util.InitConfig() flag.Parse() // go func() { // http.ListenAndServe("0.0.0.0:6060", nil) // }() runLogger() if configPath == "" || len(configPath) == 0 { logo.Infoln("!!!!!! SDK CONFIG PATH MUST EXIST !!!!!!") return } logo.Infoln(os.Args) ctx, cancel := context.WithCancel(context.Background()) ret := false if role == roleMaster { defer dump(util.LogFile + "_dump_" + time.Now().Format("20060102150405")) setParamters() ret = master.Run(ctx, "./libcomm.so", configPath) } else if role == roleSlave { ret = slave.Run(ctx, configPath, runType, id, gpu, shm) } else if role == "test" { ret = slave.TwoPluginConflict("./libcomm.so", "./zconf/Yolo.json") } if ret { c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, os.Kill, syscall.SIGTERM) <-c } cancel() logo.Close() } // const ( // configFilePath = "/opt/vasystem/config/" // configFileName = "sdkconfig" // configFileType = "yaml" // ) // viper.SetConfigType(configFileType) // viper.SetConfigName(configFileName) // viper.AddConfigPath(configFilePath) // viper.AddConfigPath("./") // envString := "" func dump(dumpFile string) { dumpErr := recover() if dumpErr == nil { return } f, err := os.Create(dumpFile) if err != nil { return } f.WriteString(fmt.Sprintf("panic:\r\n%v", dumpErr)) f.WriteString("\r\n\nstack:\r\n") f.WriteString(string(debug.Stack())) f.Close() ////////////////////////////////////////////// // restart master cmd := exec.Command(os.Args[0], os.Args[1:]...) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr cmd.Start() }