예제 #1
1
파일: config.go 프로젝트: the-varlog/gomon
func fromFile() *configurationTemp {
	data, err := ioutil.ReadFile("gomon.json")
	if err != nil {
		return nil
	}

	config := &configurationTemp{}
	err = json.Unmarshal(data, config)
	if err != nil {
		logger.PrintError("gomon.json:", err)
		return nil
	}

	if config.DelayStr != nil {
		if d, err := time.ParseDuration(*config.DelayStr); err != nil {
			logger.PrintError("gomon.json duration:", err)
			return nil
		} else {
			config.Delay = &d
		}
	}

	return config
}
예제 #2
1
파일: gomon.go 프로젝트: the-varlog/gomon
func main() {
	config := config.Get()

	configureLogger()
	printInfo()

	for {
		killing := task.New()
		restarting := task.New()

		watcher, err := fsnotify.NewWatcher()
		if err != nil {
			logger.PrintFatalError("fsnotify:", err)
		}
		addWatcher(watcher, config.Directory)
		defer watcher.Close()

		restart := fungo.Debounce(config.Delay, func() {
			restarting.Complete()
		})

		task.Do(func(t *task.Task) {
			go func() {
				for {
					select {
					case <-restarting.Awaiter():
						killing.Complete()
						t.Complete()
						return
					case e := <-watcher.Events:
						if e.Op&fsnotify.Write == fsnotify.Write {
							ext := path.Ext(e.Name)
							if len(ext) > 0 && ext[0] == '.' {
								ext = ext[1:]
							}
							for i := range config.Extensions {
								if config.Extensions[i] == ext {
									restart()
									break
								}
							}
						}
					case err := <-watcher.Errors:
						logger.PrintError("fsnotify: ", err)
					}
				}
			}()

			logger.PrintStatus("starting '" + config.Target + "'")

			binName := build()
			defer os.Remove(binName)

			bin := command(binName, config.Arguments)
			bin.Start()

			task.Do(func(t *task.Task) {
				go func() {
					killing.Await()

					if bin.Process != nil {
						bin.Process.Kill()
					}

					t.Complete()
				}()

				bin.Wait()
				killing.Complete()
			})

			fmt.Println()
			logger.PrintStatus("waiting for changes...")
		})

	}
}