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..

:

# 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

Let's follow the logic here.

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.

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)

What is your system? If you have GNU ping, it can do that all by itself.

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.

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...

1 Like

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.