LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - General (https://www.linuxquestions.org/questions/linux-general-1/)
-   -   how-to: repeat OR iterate shell OR bash command delay OR interval (https://www.linuxquestions.org/questions/linux-general-1/how-to-repeat-or-iterate-shell-or-bash-command-delay-or-interval-343892/)

admarshall 07-16-2005 11:48 PM

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>

Tinkster 07-17-2005 12:00 AM

watch -n 2 "uname -a"

admarshall 07-17-2005 12:30 AM

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 ;)

admarshall 07-17-2005 01:02 AM

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

admarshall 07-17-2005 01:14 AM

my apologies, if necessary. but it's lunchtime in saigon and i'm STARVING

i'll check back later

thanx again

admarshall 07-18-2005 10:47 PM

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.