Getting exit status of child in trap handler

Hi,

I have a trap problem when calling a child script in the background.
I know there are a lot of threads here on the issue of traps and signals, I think I have read all the relevant ones, but still haven't found an answer to my problem.

I'm working on Linux or HP, the script as you can see is in ksh.

I have written sample scripts for the sake of testing.
The parent script is as follows:

#!/bin/ksh -x

trap "echo Sub command exited with $?; exit 1" ERR

./subscript.sh  &


saved_pid=$!

while true ; do
        sleep 2
done

wait $saved_pid

echo wait returned $?

The child process is anything that runs and exits with a non-zero value. For the test I used subscript.sh which is in fact:

#!/bin/ksh  -x

sleep 1

exit 1

When I run the parent script it loops indefinitely, although the child exits with status 1.

What I need is for the parent script to exit when the child exits with failure. The problem is that I have the following limitations:

  1. The child process is run in the background, and my parent script meanwhile continues doing other things (processing the output of the child). The parent is in fact running a loop which will terminate only if the child has successfully terminated and thus provided certain output. Therefore I cannot �wait' for the child process before it finishes its output, I need any failure to stop the parent wherever it is in the script.
  2. I cannot simply set the ERR trap to exit, since I have commands in the script which return non-zero status. For example an �ls' command with a pattern that finds no files, and so returns an error. What I really want to do is set the signal handler for CHLD, and check the exit status to see if it is non-zero before exiting.
  3. The child process is not mine to change - it is an independent component, and I cannot rely on its contents, other than the fact that it will return a non-zero status when it fails.

Things I don't understand in the behavior of the script:

  1. When the child is run in the background, its non-zero exit does not trigger the ERR trap in the parent.
  2. How can I see the exit status of the child from the trap handler? As you can see in this script, I tried printing $?, but it prints 0 although I know the child returned 1.

Any ideas?

Thanks,

RO

this works -

#!/bin/ksh -x

trap "echo Sub command exited with $?; exit 1" ERR

./subscript.sh 

exit 0

the exit 0 is not executed. ksh waits for the subscript to finish.

Thanks for your reply!

I see that the 'exit 0' is indeed not executed, but I'm afraid this is still not enough.
I need to run the child script in the background so that while it is running and producing ouput the parent script can already start processing this ouput.
If I run 'subscript' in the background with the 'exit 0' following, then of course the parent script will simply exit immediately.

I don't have ksh to test with, but wouldn't the double quotes cause the $? to be interpolated at the time you declare the trap? I always learned to put traps in single quotes, and quick testing here with bash (Ubuntu Hardy) seems to bear this out.

In the ouput $? is evaluated to 0. I'm not sure at what point its evaluated, but I've tried this with a function as well, something like:

function err_handler
{
        echo The child exited  with $?
}

trap err_handler CHLD

And I still got 0 as the value of $? .