From a671c57b3b9db95a20fd4b7ec45e0f1c3255ce04 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Wed, 21 Sep 2022 17:28:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0cmd=20=E5=85=B3=E6=9C=8D?= =?UTF-8?q?=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- services/cmd/main.go | 130 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 115 insertions(+), 15 deletions(-) diff --git a/services/cmd/main.go b/services/cmd/main.go index 90af112a2..a5415d8e5 100644 --- a/services/cmd/main.go +++ b/services/cmd/main.go @@ -10,7 +10,9 @@ import ( "io/ioutil" "os" "os/exec" + "time" + "github.com/spf13/cobra" "gopkg.in/yaml.v3" ) @@ -19,8 +21,37 @@ import ( 服务描述:通过读取游戏json配置,启动服务程序 */ var ( - gmpath = flag.String("p", "./gm.json", "区服配置json") //启动服务的Id + cpath = flag.String("g", "./gm.json", "游戏区服配置") //服务列表下标 + sindex = flag.Int("i", -1, "曲阜列表下标") //服务列表下标 ) +var startCmd = &cobra.Command{ + Use: "start", + Short: "启动程序", + Run: func(cmd *cobra.Command, args []string) { + start() + }, +} +var stopCmd = &cobra.Command{ + Use: "stop", + Short: "关闭程序", + Run: func(cmd *cobra.Command, args []string) { + stop() + }, +} + +func emptyRun(*cobra.Command, []string) {} + +var RootCmd = &cobra.Command{ + Use: "dreamfactory", + Short: "命令行", + Long: "命令行工具", + Run: emptyRun, +} + +//初始化自定义cmd +func init() { + RootCmd.AddCommand(startCmd) +} func main() { flag.Parse() @@ -32,7 +63,20 @@ func main() { } else { log.Infof("Sys log Init success !") } - if config, err := readergmconf(*gmpath); err != nil { + Execute() +} + +//执行命令 +func Execute() { + if err := RootCmd.Execute(); err != nil { + fmt.Fprintln(os.Stdin, err) + os.Exit(1) + } +} + +//启动程序 +func start() { + if config, err := readergmconf(*cpath); err != nil { log.Error("读取区服配置失败!", log.Field{Key: "err", Value: err}) } else { var ( @@ -49,22 +93,28 @@ func main() { log.Error("写入服务配置失败!", log.Field{Key: "sseting", Value: sseting}, log.Field{Key: "err", Value: err}) return } - switch sseting.Type { - case comm.Service_Gateway: //网关服务 - gateways = append(gateways, sseting) - break - case comm.Service_Worker: //业务服务 - workers = append(workers, sseting) - break - case comm.Service_Mainte: //维护服务 - maintes = append(maintes, sseting) - break - default: - err = fmt.Errorf("服务类型异常 stype:%s", sseting.Type) - return + if *sindex == -1 || *sindex == i { + switch sseting.Type { + case comm.Service_Gateway: //网关服务 + gateways = append(gateways, sseting) + break + case comm.Service_Worker: //业务服务 + workers = append(workers, sseting) + break + case comm.Service_Mainte: //维护服务 + maintes = append(maintes, sseting) + break + default: + err = fmt.Errorf("服务类型异常 stype:%s", sseting.Type) + return + } } } } + if len(maintes) > 1 { + log.Error("maintes服一个区服只能有一个!") + return + } //优先启动 维护服 for _, v := range maintes { if err = startService(v); err != nil { @@ -72,6 +122,7 @@ func main() { return } } + time.Sleep(time.Second * 3) // 业务服 for _, v := range workers { if err = startService(v); err != nil { @@ -79,6 +130,7 @@ func main() { return } } + time.Sleep(time.Second * 3) // 网关服 for _, v := range gateways { if err = startService(v); err != nil { @@ -89,6 +141,24 @@ func main() { } } +//关闭程序 +func stop() { + if config, err := readergmconf(*cpath); err != nil { + log.Error("读取区服配置失败!", log.Field{Key: "err", Value: err}) + } else { + for i, v := range config.Services { + if sseting, err := convertServiceSttings(config, i, v); err != nil { + log.Error("转换服务配置异常!", log.Field{Key: "v", Value: v}, log.Field{Key: "err", Value: err}) + return + } else { + if *sindex == -1 || *sindex == i { + stopService(sseting) + } + } + } + } +} + //读取游戏配置文件 func readergmconf(path string) (config *comm.GameConfig, err error) { config = &comm.GameConfig{} @@ -211,6 +281,36 @@ func startService(sseting *core.ServiceSttings) (err error) { return } +//启动服务程序 +func stopService(sseting *core.ServiceSttings) (err error) { + var ( + cmd *exec.Cmd + command string + output []byte + ) + switch sseting.Type { + case comm.Service_Gateway: //网关服务 + command = fmt.Sprintf("./stup.sh stop %s ", sseting.Id) + break + case comm.Service_Worker: //业务服务 + command = fmt.Sprintf("./stup.sh stop %s", sseting.Id) + break + case comm.Service_Mainte: //维护服务 + command = fmt.Sprintf("./stup.sh stop %s ", sseting.Id) + break + default: + err = fmt.Errorf("服务类型异常 stype:%s", sseting.Type) + return + } + log.Debug("启动外部命令", log.Field{Key: "cmd", Value: command}) + cmd = exec.Command("/bin/bash", "-c", command) + if output, err = cmd.CombinedOutput(); err != nil { + return + } + log.Debug(string(output)) + return +} + //写入服务配置文件 func writeServiceConfig(filename string, sseting *core.ServiceSttings) (err error) { var data []byte