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  }