github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/kmg/SubCommand/serviceCmd/command.go (about) 1 package serviceCmd 2 3 import ( 4 "fmt" 5 "os" 6 7 "flag" 8 "github.com/bronze1man/kmg/errors" 9 "github.com/bronze1man/kmg/kmgCmd" 10 "github.com/bronze1man/kmg/kmgConsole" 11 "sync" 12 "time" 13 ) 14 15 //TODO 统一进程输出的输出位置,默认不区分err和out. 16 //TODO 添加stopanduninstall命令(停掉,并且卸载),删除或隐藏其他无用命令 17 18 //TODO 添加至少一个平台的测试 19 //TODO kmg gorun 可以在service运行的进程里面,目前是restart 存在bug 20 //TODO 完整描述使用过程 21 //TODO 在osx和linux上达到一致的行为 22 23 func AddCommandList() { 24 cmdGroup := kmgConsole.NewCommandGroup(). 25 AddCommand(kmgConsole.Command{ 26 Name: "setAndRestart", 27 Desc: "install the service,and restart the service,uninstall and stop if need", 28 Runner: setAndRestartCmd, 29 }).AddCommandWithName( 30 "setAndRestartV1", 31 setAndRestartCmdV1, 32 ).AddCommand(kmgConsole.Command{ 33 Name: "install", 34 Desc: "install the service", 35 Runner: installCmd, 36 }).AddCommand(kmgConsole.Command{ 37 Name: "uninstall", 38 Desc: "uninstall the serivce", 39 Runner: newNameCmd(Uninstall), 40 }).AddCommand(kmgConsole.Command{ 41 Name: "start", 42 Desc: "start the service", 43 Runner: newNameCmd(Start), 44 }).AddCommand(kmgConsole.Command{ 45 Name: "stop", 46 Desc: "stop the service", 47 Runner: newNameCmd(Stop), 48 }).AddCommand(kmgConsole.Command{ 49 Name: "restart", 50 Desc: "restart the service", 51 Runner: newNameCmd(Restart), 52 }) 53 kmgConsole.AddCommand(kmgConsole.Command{ 54 Name: "Service", 55 Runner: cmdGroup.Main, 56 }) 57 kmgConsole.AddCommand(kmgConsole.Command{ 58 Name: "Service.Process", 59 Runner: processCmd, 60 Hidden: true, 61 }) 62 kmgConsole.AddCommandWithName("Service.RunTest", func() { 63 cmd := "" 64 flag.StringVar(&cmd, "c", "kmg service restart kmgServiceTest", "") 65 flag.Parse() 66 wg := sync.WaitGroup{} 67 wg.Add(10) 68 for i := 0; i < 10; i++ { 69 go func() { 70 kmgCmd.MustRunInBash("setsid " + cmd) 71 wg.Done() 72 }() 73 } 74 wg.Wait() 75 }) 76 kmgConsole.AddCommandWithName("Service.TestJob", func() { 77 time.Sleep(time.Second * 3) 78 ServiceStartSuccess() 79 }) 80 kmgConsole.AddCommandWithName("Service.TestJobTimeout", func() { 81 time.Sleep(time.Minute * 10) 82 ServiceStartSuccess() 83 }) 84 } 85 86 type installRequest struct { 87 Name string //名字 88 ExecuteArgs []string //执行的命令,第一个是执行命令的进程地址 89 WorkingDirectory string //工作目录(默认是当前目录) 不能在upstart系统上面运行 90 } 91 92 func setAndRestartCmd() { 93 s, err := parseInstallRequest() 94 kmgConsole.ExitOnStderr(err) 95 err = Install(s) 96 if err != nil { 97 if err != ErrServiceExist { 98 kmgConsole.ExitOnStderr(err) 99 } 100 err = Uninstall(s.Name) 101 kmgConsole.ExitOnStderr(err) 102 err = Install(s) 103 kmgConsole.ExitOnStderr(err) 104 } 105 err = Restart(s.Name) 106 kmgConsole.ExitOnStderr(err) 107 } 108 109 func setAndRestartCmdV1() { 110 s, err := parseInstallRequest() 111 kmgConsole.ExitOnStderr(err) 112 err = Install(s) 113 if err != nil { 114 if err != ErrServiceExist { 115 kmgConsole.ExitOnStderr(err) 116 } 117 err = Uninstall(s.Name) 118 kmgConsole.ExitOnStderr(err) 119 err = Install(s) 120 kmgConsole.ExitOnStderr(err) 121 } 122 err = RestartV1(s.Name) 123 kmgConsole.ExitOnStderr(err) 124 } 125 126 func installCmd() { 127 s, err := parseInstallRequest() 128 kmgConsole.ExitOnStderr(err) 129 err = Install(s) 130 kmgConsole.ExitOnStderr(err) 131 } 132 133 func parseInstallRequest() (s *Service, err error) { 134 if len(os.Args) < 3 { 135 return nil, errors.New("require name,exec args") 136 } 137 s = &Service{} 138 s.Name = os.Args[1] 139 s.CommandLineSlice = os.Args[2:] 140 s.WorkingDirectory, err = os.Getwd() 141 if err != nil { 142 return 143 } 144 return 145 } 146 147 func newNameCmd(fn func(name string) error) func() { 148 return func() { 149 if len(os.Args) <= 1 { 150 fmt.Println("require name args") 151 return 152 } 153 name := os.Args[1] 154 err := fn(name) 155 kmgConsole.ExitOnErr(err) 156 } 157 }