Solved

bash random 24hr event

Posted on 2014-12-01
20
119 Views
Last Modified: 2014-12-07
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.
0
Comment
Question by:projects
  • 8
  • 7
  • 5
20 Comments
 
LVL 84

Expert Comment

by:ozo
ID: 40475253
while sleep $((82800+RANDOM%7200)) ; do function ; done
0
 

Author Comment

by:projects
ID: 40475740
Could this be added inside of a script which has multiple functions?
0
 
LVL 84

Assisted Solution

by:ozo
ozo earned 250 total points
ID: 40475744
while sleep $((82800+RANDOM%7200)) ; do function1 ; function2 ; function3 ; done
0
 
LVL 37

Accepted Solution

by:
Gerwin Jansen earned 250 total points
ID: 40475784
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
 

Author Comment

by:projects
ID: 40481876
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
 
LVL 37

Expert Comment

by:Gerwin Jansen
ID: 40481930
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
 

Author Comment

by:projects
ID: 40483608
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
 
LVL 84

Expert Comment

by:ozo
ID: 40483641
Does the router run bash?  If not, does it use some other scripting language?
0
 

Author Comment

by:projects
ID: 40483908
yes, bash, but no bc and what ever caused that second error.
0
 

Author Comment

by:projects
ID: 40483916
@Gerwin, show me how to test this in a simple bash script and I can post the results.
0
Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

 
LVL 84

Expert Comment

by:ozo
ID: 40483961
while sleep $((82800+RANDOM%7200)) ; do function1 ; function2 ; function3 ; done
does not use bc
0
 
LVL 37

Expert Comment

by:Gerwin Jansen
ID: 40483964
>> 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
 
LVL 84

Expert Comment

by:ozo
ID: 40483975
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
 

Author Comment

by:projects
ID: 40483995
@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
 
LVL 84

Expert Comment

by:ozo
ID: 40484012
So the problem is bc not bash, but you don't need bc when you have bash arithmetic.
0
 
LVL 37

Expert Comment

by:Gerwin Jansen
ID: 40484018
@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
 

Author Comment

by:projects
ID: 40484034
Can you change the timer to seconds so I can test this?
0
 
LVL 84

Expert Comment

by:ozo
ID: 40484053
All the timers suggested here sleep in seconds.
0
 

Author Comment

by:projects
ID: 40484129
LOL, yes, just noticed that :)
0
 
LVL 37

Expert Comment

by:Gerwin Jansen
ID: 40485402
PERIODH = PERIOD in Hours
PERIODS = PERIOD in Seconds

etc. :D
0

Featured Post

How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

Join & Write a Comment

The following is a collection of cases for strange behaviour when using advanced techniques in DOS batch files. You should have some basic experience in batch "programming", as I'm assuming some knowledge and not further explain the basics. For some…
How to remove superseded packages in windows w60 or w61 installation media (.wim) or online system to prevent unnecessary space. w60 means Windows Vista or Windows Server 2008. w61 means Windows 7 or Windows Server 2008 R2. There are various …
Learn several ways to interact with files and get file information from the bash shell. ls lists the contents of a directory: Using the -a flag displays hidden files: Using the -l flag formats the output in a long list: The file command gives us mor…
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.

746 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now