0

Using ksh93 i'm attempting to wait for a background process ,run_cataloguer(), to finish, from within a separate background process ,send_mail(), using the script below:

#!/usr/bin/env ksh

function run_cataloguer
{
    echo "In run_cataloguer()"
    sleep 2
    echo "leaving run_cataloguer()"
}
function send_mail
{
    echo "In send_mail()"
    #jobs
    wait_for_cataloguer
    sleep 1
    echo "Leaving send_mail() "
}
function wait_for_cataloguer
{
    echo "In wait_for_cataloguer() PID_CAT = $PID_CAT"
    wait $PID_CAT
    waitRet=$?
    echo "waitRet = $waitRet"
}

run_cataloguer &
PID_CAT=$!
echo "PID_CAT = $PID_CAT"

send_mail &

wait                            # Wait for all
echo "Finished main"

The following output is seen:

PID_CAT = 1265
In run_cataloguer()
In send_mail()
In wait_for_cataloguer() PID_CAT = 1265
waitRet = 127   # THIS SHOULD be 0
Leaving send_mail()
leaving run_cataloguer()
Finished main

The problem is waitRet = 127 which means the wait command can't see $PID_CAT, so it doesn't wait for run_cataloguer() to finish and "leaving send_mail()" is printed before "leaving run_cataloguer()" If I run send_mail in the foreground then waitRet = 0, which is correct.

So, it appears that you cannot wait for a background process from within a separate background process. Also, if I uncomment the jobs command, nothing is returned , which appears to confirm the previous statement. If anyone has a solution ,apart form using flag files, :), it would be much appreciated.

DS.
  • 604
  • 2
  • 6
  • 24

1 Answers1

1

It looks like this cannot be done. The solution I used was from Parvinder here: wait child process but get error: 'pid is not a child of this shell'

DS.
  • 604
  • 2
  • 6
  • 24