Visit Our UNIX and Linux User Community


Making a stopwatch function


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Making a stopwatch function
# 1  
Old 06-08-2011
Making a stopwatch function

#The first part of this works fine a period prints every 15 seconds (ping –c 3, takes 2 seconds). However no “Minutes since start = “ message prints.

#By all rights it should print 2 times once when it is outputted from “grep” and a second time when cat reads it. I would use cron but I am not sure how to make cron work the way I need it to for this program, I need a stopwatch that notifies every 60 seconds, 5 minutes, 20 minutes etc…

#I know this is a roundabout method but I am still pretty new to UNIX so go easy on me. Other methods of doing this would be great but I would really appreciate help getting this to work as it would give me a better understanding.

#The script is as follows..

:
Code:
# Contained test of principal
#
cnt=0
while [ $cnt -lt 600 ]
 do
    while [ $cnt -lt 300 ]
     do
      echo .
      ping -c 3 not_connected_IP>>/tmp/pinglog$$.txt
      sleep 13
      ((cnt=cnt+15))
     done

    while [ $cnt -lt 300 ]
     do
      echo -n "Minutes since start = " > divres
      echo "scale=2; $cnt/60" | bc >> divres
      if cat divres | grep .00
       then
        echo
        cat divres
      fi
     done
 done
rm -r /tmp/pinglog$$.txt


Last edited by pludi; 06-08-2011 at 06:18 PM..
# 2  
Old 06-08-2011
Let's follow the logic here.

Code:
cnt=0
while [ $cnt -lt 600 ]
 do

    while [ $cnt -lt 300 ]
     do
      echo .
      # Instead of opening pinglog$$.txt n/15 times, redirect the
      # while loop itself, so you only open it once.
      ping -c 3 not_connected_IP#>>/tmp/pinglog$$.txt
      sleep 13
      ((cnt=cnt+15))
      # Jumps back up to the top of the loop if cnt is less than 300.
     done >> /tmp/pinglog$$.txt

    # to reach here, the while loop must have ended.  Therefore, 
    # cnt is already >= 300.  So this next while loop never happens.
    while [ $cnt -lt 300 ]
     do
      echo -n "Minutes since start = " > divres
      echo "scale=2; $cnt/60" | bc >> divres

#      this is a Useless Use of Cat.  http://partmaps.org/era/unix/award.html
#      grep doesn't need cat's help.
#
#      You should also use grep -q so grep doesn't try print matching lines.
#      Also:  Are you trying to match a literal dot?  dots mean 'any character'
#      grep.  Escape it with a backslash to make it match only the dot char.
#      if cat divres | grep .00
       if grep -q "\.00" < divres
       then
        echo
        cat divres
      fi
     done

     # Loops back to the beginning of the first while loop whenever
     # cnt is less than 600.
     # But cnt will never be greater than 300 because your inner
     # while loops stop doing anything past 300.
     # so this becomes an infinite loop!
 done
rm -r /tmp/pinglog$$.txt

I don't know how to simplify or fix a lot of this since I don't know what you were actually trying to do with it either.
# 3  
Old 06-08-2011
Sorry, maybe I should clarify (I was at work, couldn't spend a lot of time on the forum). I want the program to print a period every 15 seconds that ping does not reach the host. Then every 60 seconds I want the second loop to print the contents of the divres which will say
"Minutes since start = ?.00
I have grep searching for ".00" because I want only the integer values when $cnt is divided by 60 anything but the minutes will show a decimal.
I go on in the rest of the program to apply the same principal from 900 - 1800 (value of $cnt) seconds and then -gt 1800 seconds.

Also I should have looked, this came from an earlier version the sleep time in the first loop should only be 2 seconds, because 3 failed pings actually take a rough average of 13 seconds.

I should have also included that the whole thing is contained in a while loop that looks for the output of 3 successful pings in pinglog.txt

I guess I need to practice my posting some too ey.

Thanks for your reply (and patience)
# 4  
Old 06-09-2011
Quote:
Originally Posted by ifthanwhile
Sorry, maybe I should clarify (I was at work, couldn't spend a lot of time on the forum). I want the program to print a period every 15 seconds that ping does not reach the host.
What is your system? If you have GNU ping, it can do that all by itself.
Code:
ping -w 15 -f mysite.com

Every 15 seconds, it will print one "." and backspace it if/when it gets a reply. The -c 4 will limit it to 4 pings and therefore one minute.
Quote:
Then every 60 seconds I want the second loop to print the contents of the divres which will say
"Minutes since start = ?.00
I have grep searching for ".00" because I want only the integer values when $cnt is divided by 60 anything but the minutes will show a decimal.
There's far better ways to do math in the shell, but which one you should use depends on what your system and shell is...
This User Gave Thanks to Corona688 For This Post:
# 5  
Old 06-17-2011
Thanks everybody I ended up reformatting to include everything in one while loop after realizing that my linear process was messed up by trying to put everything in its own loop.
Thanks Corona I did not know about some of the functions of ping, I just figured it was pretty simple.

Previous Thread | Next Thread
Test Your Knowledge in Computers #792
Difficulty: Easy
In mathematics and digital electronics, a binary number is a number expressed in the base-2 numeral system or binary numeral system.
True or False?

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Function - Make your function return an exit status

Hi All, Good Day, seeking for your assistance on how to not perform my 2nd, 3rd,4th etc.. function if my 1st function is in else condition. #Body function1() { if then echo "exist" else echo "not exist" } #if not exist in function1 my all other function will not proceed.... (4 Replies)
Discussion started by: meister29
4 Replies

2. Shell Programming and Scripting

Need help on awk for printing the function name inside each function

Hi, I am having script which contains many functions. Need to print each function name at the starting of the function. Like below, functionname() { echo "functionname" commands.... } I've tried like below, func=`grep "()" scriptname | cut -d "(" -f1` for i in $func do nawk -v... (4 Replies)
Discussion started by: Sumanthsv
4 Replies

3. Shell Programming and Scripting

Will files, creaetd in one function of the same script will be recognized in another function?

Dear All. I have a script, which process files one by one. In the script I have two functions. one sftp files to different server the other from existing file create file with different name. My question is: Will sftp function recognize files names , which are created in another... (1 Reply)
Discussion started by: digioleg54
1 Replies

4. UNIX for Dummies Questions & Answers

Making a function

I am practicing making my own functions in bash for an upcoming exam. For this example, I want to print out a message and maybe add two numbers. What I would do then is: bash-3.2$ function practice { #code to print #code to add } This would be run using an input file, that would... (1 Reply)
Discussion started by: Midwest Product
1 Replies

5. Shell Programming and Scripting

SHELL SCRIPT Function Calling Another Function Please Help...

This is my function which is creating three variables based on counter & writing these variable to database by calling another function writeRecord but only one record is getting wrote in DB.... Please advise ASAP...:confused: function InsertFtg { FTGSTR="" echo "Saurabh is GREAT $#" let... (2 Replies)
Discussion started by: omkar.sonawane
2 Replies

6. Shell Programming and Scripting

Return a value from called function to the calling function

I have two scripts. script1.sh looks -------------------------------- #!/bin/bash display() { echo "Welcome to Unix" } display ----------------------------- Script2.sh #!/bin/bash sh script1.sh //simply calling script1.sh ------------------------------ (1 Reply)
Discussion started by: mvictorvijayan
1 Replies

7. Shell Programming and Scripting

Passing global variable to a function which is called by another function

Hi , I have three funcions f1, f2 and f3 . f1 calls f2 and f2 calls f3 . I have a global variable "period" which i want to pass to f3 . Can i pass the variable directly in the definition of f3 ? Pls help . sars (4 Replies)
Discussion started by: sars
4 Replies

8. Shell Programming and Scripting

How to implement stopwatch in bash?

I want to time how long it takes to run some programmes and report the delta time in days, hours, minutes and seconds using a simple echo. Does someone have a simple bash script to do this? Thanks, siegfried (2 Replies)
Discussion started by: siegfried
2 Replies

9. Shell Programming and Scripting

PERL: Stopwatch + record

Is it possible to make a perl or cgi script that does the following ? 1) have a stopwatch with a start / start / pause feature and record the time its paused on. but be able to record up to ten different times 2)print the recorded time to .txt file (1 Reply)
Discussion started by: perleo
1 Replies

Featured Tech Videos