how-to: repeat OR iterate shell OR bash command delay OR interval
Is there already one bash command to do what the following script does (poorly or incompletely), ie repeat "command" indefinitely every "x" seconds:
#!/bin/sh # usage: repeat [x] <command> while true ; do $2 ; sleep $1 ; done if not, and you want to use the above in a script of your own, just copy the above 3 lines and do the following (typing the lines into the console or pasting them in shell, using konsole under kde or gpm under a tty shell; hit <Ctrl-c> to stop it from looping). The two examples are optional. The stuff in angle brackets, <>, is stuff you won't see in your shell output: am@[bin]$ cat >repeat #!/bin/sh # usage: repeat [x] <command> while true ; do $2 ; sleep $1 ; done am@[bin]$ chmod +x repeat <examples> am@[bin]$ ./repeat 2 "cat /proc/loadavg" 0.46 0.92 1.72 9/125 24171 0.46 0.92 1.72 2/125 24173 0.59 0.94 1.72 1/125 24181 <Ctrl-c> am@[bin]$ cd .. am@[~]$ repeat 2 uname Linux Linux <Ctrl-c> |
watch -n 2 "uname -a"
|
that's great to know about. thanks, tinkster.
but i really don't want to switch to full-screen mode as "watch" does. PS: i hit the "Thanks" button, but don't have a cc, paypal or other to plug in the min $5 ;) |
actually, to be more specific, what i'm trying to do is something like this --
though i'm screwing up on quoting or something am@[~]$ repeat 2 "echo $(cat /proc/loadavg ; date +%H:%m:%S)" 0.05 0.14 0.24 6/127 27711 12:07:29 0.05 0.14 0.24 6/127 27711 12:07:29 0.05 0.14 0.24 6/127 27711 12:07:29 as you can see, only one instance of load average and time are repeated. i want a running record that can be redirected to a file |
my apologies, if necessary. but it's lunchtime in saigon and i'm STARVING
i'll check back later thanx again |
I worked out a cheap hack for what i wanted. But thanks all the same...
In case you're interested: am@[sh]$ rewatch 2 'cat /proc/loadavg' 0.51 0.36 0.65 1/121 9072 09:56:08 0.51 0.36 0.65 1/121 9083 09:56:10 0.47 0.36 0.65 1/121 9088 09:56:13 am@[sh]$ rewatch 2 'cat /proc/loadavg' 'mozilla' | tee rewatch-mozilla 0.43 0.35 0.65 1/121 9100 09:56:20 am 32106 0.0 0.3 3832 988 ? S 07:37 0:00 /bin/sh /usr/bin/mozilla am 32112 10.0 25.7 141688 66084 ? Sl 07:37 13:54 /opt/mozilla/lib/mozilla-bin 0.40 0.34 0.64 3/121 9109 09:56:22 am 32106 0.0 0.3 3832 988 ? S 07:37 0:00 /bin/sh /usr/bin/mozilla am 32112 10.0 25.7 141688 66092 ? Sl 07:37 13:54 /opt/mozilla/lib/mozilla-bin am@[sh]$ cat ~/bin/rewatch #!/bin/sh # rewatch, v. 0.01 # # Usage: rewatch <n> <cmdline> [process-to-watch] # n: seconds between repetitions # cmdline: command-line to repeat # process-to-watch: process for which "ps aux" info is to be displayed # # Purpose: repeat and, optionally, watch and record the "ps aux" info of # that or any other process # # Bkgd: original purpose was to be able to input a command-line (in single # quotes) along with an interval in seconds for its repetion and print a # list of its stdouts labelled by the times they were printed until <Ctrl-c> # is hit, and be able to capture all the output to stdout or a file. # # initial use was for watching and recording load averages as programs were # loaded, eg, "re_watch 2 'cat /proc/loadavg' konqueror" # # Future: unknown # # Known Bugs: no input validation or user feedback for input errors # # Of course, bash operators will have to be properly quoted or escaped or # not... -- which i still don't clearly understand n=$1 cmdline=$2 proc2watch=$3 if test -z "$3" then while true ; do echo $( $cmdline && echo "$( date +%H:%M:%S )" ) ; sleep $n ; done else while true ; do echo $( $cmdline && echo "$( date +%H:%M:%S )" ) ; echo "$( ps aux | grep -vE "(rewatch |grep |tee )" | grep $proc2watch )" ; sleep $n ; done fi am@[sh]$ |
All times are GMT -5. The time now is 12:41 AM. |