github.com/mvdan/u-root-coreutils@v0.0.0-20230122170626-c2eef2898555/cmds/exp/watch/watch.go (about) 1 // Copyright 2015-2021 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // watch periodically executes the executable specified in argument. 6 // 7 // Synopsis: 8 // 9 // watch [-n] SEC [-t] cmd-exec 10 // 11 // Description: 12 // 13 // cmd-exec is executed every n seconds 14 // example, watch -n 5 dmesg >> log.txt 15 // : executes dmesg every 5 sec and stores the log in log.txt 16 // 17 // Options: 18 // 19 // -n: time in seconds 20 // -t: do not print header 21 package main 22 23 import ( 24 "flag" 25 "fmt" 26 "os" 27 "os/exec" 28 "strings" 29 "time" 30 ) 31 32 var ( 33 t = flag.Bool("t", false, "Don't print header") 34 n = flag.Int64("n", 2, "Loop period in SEC, default 2") 35 ) 36 37 func init() { 38 flag.Usage = func() { 39 fmt.Fprintf(os.Stderr, "watch [-n SEC] [-t] PROG ARGS\n") 40 fmt.Fprintf(os.Stderr, "Run PROG Periodically\n") 41 42 flag.PrintDefaults() 43 } 44 } 45 46 func main() { 47 flag.Parse() 48 argRem := flag.Args() 49 50 // argRem is the remaining args(non flag) after parsing. 51 if len(argRem) == 0 { 52 flag.Usage() 53 os.Exit(0) 54 } 55 56 seconds := uint64(*n) 57 if seconds <= 0 { 58 seconds = 2 59 } 60 61 for { 62 fmt.Print("\033[0;0H") 63 fmt.Print("\033[J") 64 if !*t { 65 fmt.Printf("Every %d : %v \n\n", seconds, argRem) 66 } 67 cmd := exec.Command(argRem[0], argRem[1:]...) 68 cmd.Stdin = os.Stdin 69 cmd.Stdout = os.Stdout 70 cmd.Stderr = os.Stderr 71 if err := cmd.Run(); err != nil { 72 if strings.Contains(err.Error(), "executable file not found") { 73 fmt.Print(err) 74 } 75 } 76 77 time.Sleep(time.Second * time.Duration(seconds)) 78 } 79 }