| package main |
| |
| import ( |
| "crypto/sha256" |
| "flag" |
| "fmt" |
| "io" |
| "os" |
| "syscall" |
| "time" |
| ) |
| |
| var watch = flag.String("watch", "", "Path to watch") |
| var reload = flag.String("reload", "", "Path to PID file") |
| |
| func check(err error) { |
| if err != nil { |
| panic(err) |
| } |
| } |
| |
| func main() { |
| flag.Parse() |
| var prev string |
| for { |
| cur := func() string { |
| inp, err := os.Open(*watch) |
| check(err) |
| defer inp.Close() |
| h := sha256.New() |
| _, err = io.Copy(h, inp) |
| check(err) |
| return string(h.Sum(nil)) |
| }() |
| if prev == "" { |
| prev = cur |
| continue |
| } |
| if prev != cur { |
| prev = cur |
| fmt.Println("changed") |
| pid := func() int { |
| inp, err := os.Open(*reload) |
| // TODO(gio): check error type |
| if err != nil { |
| return -1 |
| } |
| defer inp.Close() |
| var ret int |
| _, err = fmt.Fscanf(inp, "%d", &ret) |
| check(err) |
| return ret |
| }() |
| if pid != -1 { |
| p, err := os.FindProcess(pid) |
| check(err) |
| fmt.Println("found process") |
| fmt.Println("%+v\n", p) |
| // TODO(gio): take signal value from flags |
| check(p.Signal(syscall.SIGKILL)) |
| fmt.Println("sent signall") |
| } |
| } else { |
| fmt.Println("no change") |
| } |
| time.Sleep(5 * time.Second) |
| } |
| } |