| gio | f55ab36 | 2025-04-11 17:48:17 +0400 | [diff] [blame^] | 1 | package main |
| 2 | |
| 3 | import ( |
| 4 | "crypto/sha256" |
| 5 | "flag" |
| 6 | "fmt" |
| 7 | "io" |
| 8 | "os" |
| 9 | "syscall" |
| 10 | "time" |
| 11 | ) |
| 12 | |
| 13 | var watch = flag.String("watch", "", "Path to watch") |
| 14 | var reload = flag.String("reload", "", "Path to PID file") |
| 15 | |
| 16 | func check(err error) { |
| 17 | if err != nil { |
| 18 | panic(err) |
| 19 | } |
| 20 | } |
| 21 | |
| 22 | func main() { |
| 23 | flag.Parse() |
| 24 | var prev string |
| 25 | for { |
| 26 | cur := func() string { |
| 27 | inp, err := os.Open(*watch) |
| 28 | check(err) |
| 29 | defer inp.Close() |
| 30 | h := sha256.New() |
| 31 | _, err = io.Copy(h, inp) |
| 32 | check(err) |
| 33 | return string(h.Sum(nil)) |
| 34 | }() |
| 35 | if prev == "" { |
| 36 | prev = cur |
| 37 | continue |
| 38 | } |
| 39 | if prev != cur { |
| 40 | prev = cur |
| 41 | fmt.Println("changed") |
| 42 | pid := func() int { |
| 43 | inp, err := os.Open(*reload) |
| 44 | // TODO(gio): check error type |
| 45 | if err != nil { |
| 46 | return -1 |
| 47 | } |
| 48 | defer inp.Close() |
| 49 | var ret int |
| 50 | _, err = fmt.Fscanf(inp, "%d", &ret) |
| 51 | check(err) |
| 52 | return ret |
| 53 | }() |
| 54 | if pid != -1 { |
| 55 | p, err := os.FindProcess(pid) |
| 56 | check(err) |
| 57 | fmt.Println("found process") |
| 58 | fmt.Println("%+v\n", p) |
| 59 | // TODO(gio): take signal value from flags |
| 60 | check(p.Signal(syscall.SIGKILL)) |
| 61 | fmt.Println("sent signall") |
| 62 | } |
| 63 | } else { |
| 64 | fmt.Println("no change") |
| 65 | } |
| 66 | time.Sleep(5 * time.Second) |
| 67 | } |
| 68 | } |