github.com/keysonZZZ/kmg@v0.0.0-20151121023212-05317bfd7d39/kmg/SubCommand/WatchCmd.go.bak (about) 1 package command 2 3 /* 4 import ( 5 "fmt" 6 "os" 7 "os/exec" 8 9 "github.com/bronze1man/kmg/console" 10 "github.com/bronze1man/kmg/fsnotify" 11 "github.com/bronze1man/kmg/kmgCmd" 12 ) 13 14 type WatchCmd struct { 15 context *console.Context 16 wd string 17 watcher *fsnotify.Watcher 18 cmd *exec.Cmd 19 isDebug bool //more output 20 } 21 22 func (command *WatchCmd) GetNameConfig() *console.NameConfig { 23 return &console.NameConfig{Name: "WatchCmd", 24 Short: "watch current directory and kill and reexecute a command", 25 } 26 } 27 28 func (command *WatchCmd) Execute(context *console.Context) error { 29 command.isDebug = false 30 command.context = context 31 if len(context.Args) <= 2 { 32 return fmt.Errorf("usage: %s watch [command]", context.ExecutionName) 33 } 34 var err error 35 command.wd, err = os.Getwd() 36 if err != nil { 37 return err 38 } 39 runner, err := fsnotify.NewRunner(10000) 40 if err != nil { 41 return err 42 } 43 runner.Watcher.ErrorHandler = func(err error) { 44 fmt.Println("watcher.Error error: ", err) 45 } 46 runner.Watcher.WatchRecursion(command.wd) 47 // wait forever 48 runner.Run(func() { 49 err := command.restart() 50 if err != nil { 51 fmt.Println("command.restart() error: ", err) 52 } 53 }) 54 return nil 55 } 56 func (command *WatchCmd) restart() error { 57 //kill old process 58 err := command.stop() 59 if err != nil { 60 return err 61 } 62 63 command.cmd = kmgCmd.NewStdioCmd(command.context, command.context.Args[2], command.context.Args[3:]...) 64 err = command.cmd.Start() 65 if err != nil { 66 return fmt.Errorf("restart error: %s", err.Error()) 67 } 68 fmt.Println("[kmg] cmd running pid:", command.cmd.Process.Pid) 69 go func() { 70 cmd := command.cmd 71 err := cmd.Wait() 72 fmt.Println("[kmg] cmd exit pid:", cmd.Process.Pid) 73 if err != nil { 74 command.debugPrintln("wait error: ", err.Error()) 75 } 76 }() 77 return nil 78 } 79 80 func (command *WatchCmd) stop() error { 81 if command.cmd == nil { 82 return nil 83 } 84 if command.cmd.Process == nil { 85 return nil 86 } 87 err := command.cmd.Process.Kill() 88 if err != nil { 89 command.debugPrintln("Process.Kill() error", err) 90 } 91 return nil 92 } 93 func (command *WatchCmd) debugPrintln(o ...interface{}) { 94 if command.isDebug { 95 fmt.Println(o...) 96 } 97 } 98 */