The UNIX and Linux Forums  

Go Back   The UNIX and Linux Forums > Top Forums > Shell Programming and Scripting
Google UNIX.COM


Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts here.

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Bash: Exiting while true loop when terminal is not the focus window acclaypool Shell Programming and Scripting 2 02-25-2008 02:02 PM
awk completes early nhatch Shell Programming and Scripting 4 08-03-2007 06:19 AM
Script Not Exiting??? lesstjm Shell Programming and Scripting 1 07-11-2007 08:58 AM
exiting in c ruffenator High Level Programming 3 04-27-2002 11:31 PM

Reply
 
LinkBack Thread Tools Display Modes
  #1 (permalink)  
Old 03-20-2008
Registered User
 

Join Date: Feb 2008
Posts: 11
Question Else Loop Exiting Early

All,

I'm having a problem w/this function. Specifically, I want to call another function (get_stats) when the process in the else completes (the initial if and the elsif seem to work fine). But what's happening is the get_stats function call is running after the else runs only once, NOT when it completes. I need the else condtion to run until the process completes, THEN call get_stats. Thanks in advance!

check_ul_process()
{
PROGRAM=8675309
LONG_SLEEP=5
SLEEP_TIME=1
UL_PROCESS=$(ps -eaf | grep $PROGRAM | grep -v grep | wc -l)

# if 8675309 isn't running
# and it's not being run by cron,
# re-check

if [ $UL_PROCESS -eq 0 ]
then
while [ $LONG_SLEEP -gt 0 ]
do
if test $STARTED_BY_CRON = "False"
then
echo "\rTime to next check - $LONG_SLEEP\c"
fi
let LONG_SLEEP=LONG_SLEEP-1
sleep $SLEEP_TIME
done

LONG_SLEEP=5
check_ul_process
elsif [ $UL_PROCESS -eq 0 -a $UL_FILE_TYPE = TEMP ]

# if a ul_temp file exists
# and 8675309 is not running,
# log error and exit.

echo $(expr substr $(hostname) 5 2 | tr 'a-z' 'A-Z') "::" $(date +'%D %T') ":: Exiting. A .ul_temp file exists, but the upload process isn't running." >> /ops/log/ulgen_report.log #~/test_report.log
exit
else

# if 8675309 is running
# and it's not being run by cron,
# check it until it completes

while [ $LONG_SLEEP -gt 0 ]
do
if test $STARTED_BY_CRON = "False"
then
echo "\rTime to next check - $LONG_SLEEP\c"
fi
let LONG_SLEEP=LONG_SLEEP-1
sleep $SLEEP_TIME
done

LONG_SLEEP=5
get_stats
exit
fi
}
Reply With Quote
Forum Sponsor
  #2 (permalink)  
Old 03-20-2008
joeyg's Avatar
premier etoile de match
 

Join Date: Dec 2007
Location: Home of world champion Boston Celtics
Posts: 531
Question Can you edit/re-submit with code tags?

Being able to see the script indented makes if - then - else and other stuctures easier to read and follow.
Reply With Quote
  #3 (permalink)  
Old 03-20-2008
Registered User
 

Join Date: Feb 2008
Posts: 11
RE: Else Loop Exiting Early

Sure (I didn't realize 1) that you could use the code tag and 2) that when posting, it would remove my formatting. Sorry!

Code:
check_ul_process()
{
   PROGRAM=8675309
   LONG_SLEEP=5
   SLEEP_TIME=1
   UL_PROCESS=$(ps -eaf | grep $PROGRAM | grep -v grep | wc -l)

   # if 8675309 isn't running
   # and it's not being run by cron,
   # re-check

   if [ $UL_PROCESS -eq 0 ]
   then
      while [ $LONG_SLEEP -gt 0 ]
      do
         if test $STARTED_BY_CRON = "False"
         then
            echo "\rTime to next check - $LONG_SLEEP\c"
         fi
         let LONG_SLEEP=LONG_SLEEP-1
         sleep $SLEEP_TIME
      done

      LONG_SLEEP=5
      check_ul_process

   elsif [ $UL_PROCESS -eq 0 -a $UL_FILE_TYPE = TEMP ]

   # if a ul_temp file exists
   # and 8675309 is not running,
   # log error and exit.

      echo $(expr substr $(hostname) 5 2 | tr 'a-z' 'A-Z') "::" $(date +'%D %T') ":: Exiting. A .ul_temp file exists, but the upload process isn't running." >> /ops/log/ulgen_report.log #~/test_report.log
      exit

   else

   # if 8675309 is running
   # and it's not being run by cron,
   # check it until it completes

      while [ $LONG_SLEEP -gt 0 ]
      do
         if test $STARTED_BY_CRON = "False"
         then
            echo "\rTime to next check - $LONG_SLEEP\c"
         fi
         let LONG_SLEEP=LONG_SLEEP-1
         sleep $SLEEP_TIME
      done

      LONG_SLEEP=5
      get_stats
      exit
   fi
}
Reply With Quote
  #4 (permalink)  
Old 03-20-2008
joeyg's Avatar
premier etoile de match
 

Join Date: Dec 2007
Location: Home of world champion Boston Celtics
Posts: 531
Question A couple of things I noticed

Code:
      check_ul_process

   elsif [ $UL_PROCESS -eq 0 -a $UL_FILE_TYPE = TEMP ]
(1) Your first if condition calls itself - you are nesting a restart of the program.
(2) I do not think this 'elsif' can execute since the simpler first part [$UL_PROCESS -eq 0] would always be caught above.
(3) I cannot say for sure, but your "if then elsif else fi" does not quite feel right. Perhaps it requires "elif then" to make computer logic correct.
Reply With Quote
  #5 (permalink)  
Old 03-20-2008
Registered User
 

Join Date: Feb 2008
Posts: 11
RE: Else Loop Exiting Early

Joey,

1) Correct. I want it to run until 8675309 starts. Then on the next check it should go to else.

2) Should I change it to
if [ $UL_FILE_TYPE = TEMP -a $UL_PROCESS -eq 0 ]
That is check the file type first and then check for the process?

3) elif is correct; my misspelling. Thanks for the catch!
Reply With Quote
  #6 (permalink)  
Old 03-20-2008
joeyg's Avatar
premier etoile de match
 

Join Date: Dec 2007
Location: Home of world champion Boston Celtics
Posts: 531
Question Clarifications..

1) Correct. I want it to run until 8675309 starts. Then on the next check it should go to else.

2) Should I change it to
if [ $UL_FILE_TYPE = TEMP -a $UL_PROCESS -eq 0 ]
That is check the file type first and then check for the process?

3) elif is correct; my misspelling. Thanks for the catch!

In response:
1) I think this is odd as you will have two occurrences of the program then running. You run, catch the condition, wait, and start again "as a sub-process". This 2nd run may have different results at "if" statements. Assuming it too does not get caught by the first loop - thus creating a third instance of the script running - control would be returned to the first run at the "elsif" line. Perhaps rethink the logic to a "do while" or "do until" set of commands?
2) I was not commenting on the order within the if, more the logic that I do not believe the program could ever find your "elsif" logic true and able to be executed. The first if is true (UL -eq 0) meaning the "elsif" would not be exexcuted. The first is false (UL -eq 0) meaning the "elsif" would be analyzed, but how could it be now true? Unless this is all to catch the sub-process I referred to in (1)?
3) Concur that "elsif" should be "elif". My other point is that an "elif" should then have its own "then". "elif" expects a "then", so does the program skip a bunch of logic until it finds your next "then" occurrence?
Reply With Quote
  #7 (permalink)  
Old 03-20-2008
Registered User
 

Join Date: Feb 2008
Posts: 11
Program Flow/Logic Question

Sorry, I'm new to this and am surprised I've made it this far.

Can I do a

Code:
UL_PROCESS=$(ps -eaf | grep $PROGRAM | grep -v grep | wc -l)

while [ $UL_PROCESS -ne 0 ]
do
...
done
or should it be

Code:
while [ `ps -eaf | grep $PROGRAM | grep -v grep | wc -l` -ne 0]
do
...
done
?
Reply With Quote
Google UNIX.COM
Reply

Thread Tools
Display Modes




All times are GMT -7. The time now is 08:30 PM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited.
The UNIX and Linux Forums Content Copyright ©1993-2008 The CEP Blog All Rights Reserved -Ad Management by RedTyger Visit The Global Fact Book

Content Relevant URLs by vBSEO 3.2.0