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  }