package watch import ( "os" "os/signal" "path/filepath" syscall "golang.org/x/sys/unix" "github.com/fsnotify/fsnotify" ) func CreateWatchers(filePath string) (chan os.Signal, *fsnotify.Watcher, error) { osWatcher := newSignalWatcher(syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) filesystemWatcher, err := NewFilesystemWatcher(filePath) if err != nil { return nil, nil, err } return osWatcher, filesystemWatcher, nil } func NewFilesystemWatcher(filePath string) (*fsnotify.Watcher, error) { watcher, err := fsnotify.NewWatcher() if err != nil { return nil, err } var files []string err = filepath.Walk(filePath, func(path string, info os.FileInfo, err error) error { if info.IsDir() { files = append(files, path) } return err }) if err != nil { return nil, err } for _, file := range files { err = watcher.Add(file) if err != nil { watcher.Close() return nil, err } } return watcher, nil } func newSignalWatcher(signals ...os.Signal) chan os.Signal { signalChan := make(chan os.Signal, 1) signal.Notify(signalChan, signals...) return signalChan } func NewConfigWatcher(filePath string) (*fsnotify.Watcher, error) { watcher, err := fsnotify.NewWatcher() if err != nil { return nil, err } err = watcher.Add(filePath) if err != nil { watcher.Close() return nil, err } return watcher, nil }