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!
# 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
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
}
(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.
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?
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!
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!