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
}

Being able to see the script indented makes if - then - else and other stuctures easier to read and follow.

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

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

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!

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?

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

Can I do a

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

while [ $UL_PROCESS -ne 0 ]
do
...
done

or should it be

while [ `ps -eaf | grep $PROGRAM | grep -v grep | wc -l` -ne 0]
do
...
done

?

I would think your first choice easier to understand and error-check.

I personally like the first approach since between those two lines you can insert
>echo $UL_PROCESS

This get to preference, skill level, speed necessary (if churning thru lots of records) and ability for others to understand your code in the future. Thus, I normally choose the path where I set a variable in one line, then check it next.

Perhaps logic like the following, and I know the syntax is all bad! :slight_smile:

while $UL -eq 0
do
if filetype=temp
then
do your hostname thing
exit
fi
sleep
date # show that something is happening and looping, delete later
done

#at this point $UL -ne 0 & not temp filetype
#so the rest of your logic

Thanks for the example. My question was because I wasn't sure if the variable UL_PROCESS would be set/reset every time.

What I'm doing is creating a script that can be run via cron or command line. Basically it looks to see if certain files exist, if they do then it checks if a certain process is running; if it's not, it keeps checking, otherwise, it gets the stats for that file that was processed and e-mails them. This (the function I posted) is (seems to be anyway) the only part that's not working correctly.

I'll try to repost in the next few days on my progress. Thanks!