bash random 24hr event

Using bash, I want to have a function which runs every X amount of time but within a range.
For example, a variable which might be set to 12hrs or 24hrs.

However, I want the function to be randomly set off, between one hour before or after the 24hr period. In other words, I need an event which runs approximately every X amount of time but not exactly on that time.

Looking for bash code as a solution.

Thanks.
projectsAsked:
Who is Participating?
 
Gerwin Jansen, EE MVETopic Advisor Commented:
while :
do
  # variable
  PERIODH=12
  PERIODS=$((${PERIODH}*3600))

  # offset (2 meaning +/- 1 hour)
  OFFSETH=2
  OFFSETS=$(echo "scale=0 ; (-16384 + ${RANDOM}) * 3600 / 32768 * ${OFFSETH} " | bc -l)

  # wait before launch
  sleep $((${PERIODS}+${OFFSETS}))

  echo "Put your function call here"
done

Open in new window

0
 
ozoCommented:
while sleep $((82800+RANDOM%7200)) ; do function ; done
0
 
projectsAuthor Commented:
Could this be added inside of a script which has multiple functions?
0
Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
ozoCommented:
while sleep $((82800+RANDOM%7200)) ; do function1 ; function2 ; function3 ; done
0
 
projectsAuthor Commented:
Darn, turns out this won't work on the device I am using for testing.
I don't have any bc package available and there is an error.

# ./rand
./rand: line 27: bc: command not found
./rand: line 30: 7200+: syntax error: operand expected (error token is "+")
0
 
Gerwin Jansen, EE MVETopic Advisor Commented:
What 'device' would that be? If it doesn't even support this line: sleep $((${PERIODS}+${OFFSETS})) then it's going to be hard to calculate anything. You did not test before you accepted a solution? A $((expression)), - and + are supported in bash (see man page).
0
 
projectsAuthor Commented:
In this case, it is on an openwrt router.
I usually test the solution before hand but in this case, I failed to do that.
0
 
ozoCommented:
Does the router run bash?  If not, does it use some other scripting language?
0
 
projectsAuthor Commented:
yes, bash, but no bc and what ever caused that second error.
0
 
projectsAuthor Commented:
@Gerwin, show me how to test this in a simple bash script and I can post the results.
0
 
ozoCommented:
while sleep $((82800+RANDOM%7200)) ; do function1 ; function2 ; function3 ; done
does not use bc
0
 
Gerwin Jansen, EE MVETopic Advisor Commented:
>> what ever caused that second error
The second error is caused by this line:

$((${PERIODS}+${OFFSETS}))

this is just basic arithmetic in bash, try if this works on your router"

PERIODS=2
OFFSETS=10
echo $((${PERIODS}+${OFFSETS}))

you should get 12 as a result. If that doesn't work then you don't have a normal bash shell. What do you get from:

bash --version
0
 
ozoCommented:
If the bc failed, and $OFFSETS was blank, then
sleep $((${PERIODS}+${OFFSETS}))
would be
sleep $((7200+))
which would cause an error in a normal bash shell
But a normal bash shell should not need to do
$(echo "scale=0 ; (-16384 + ${RANDOM}) * 3600 / 32768 * ${OFFSETH} " | bc -l)
if it could just do
$(( (-16384 + ${RANDOM}) * 3600 / 32768 * ${OFFSETH} ))
0
 
projectsAuthor Commented:
@Gerwin; I get a 12.

I know it's pretty standard bash, just doesn't have as many tools as normal since this is just a small embedded device.

# bash --version
GNU bash, version 4.2.53(1)-release (mips-openwrt-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
0
 
ozoCommented:
So the problem is bc not bash, but you don't need bc when you have bash arithmetic.
0
 
Gerwin Jansen, EE MVETopic Advisor Commented:
@ozo - Correct, code with your modified line:
while :
do
  # variable
  PERIODH=12
  PERIODS=$((${PERIODH}*3600))

  # offset (2 meaning +/- 1 hour)
  OFFSETH=2
  OFFSETS=$(( (-16384 + ${RANDOM}) * 3600 / 32768 * ${OFFSETH} ))

  # wait before launch
  sleep $((${PERIODS}+${OFFSETS}))

  echo "Put your function call here"
done

Open in new window


works in bash :)
0
 
projectsAuthor Commented:
Can you change the timer to seconds so I can test this?
0
 
ozoCommented:
All the timers suggested here sleep in seconds.
0
 
projectsAuthor Commented:
LOL, yes, just noticed that :)
0
 
Gerwin Jansen, EE MVETopic Advisor Commented:
PERIODH = PERIOD in Hours
PERIODS = PERIOD in Seconds

etc. :D
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.