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:
- 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.
- 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.
- 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:
- When the child is run in the background, its non-zero exit does not trigger the ERR trap in the parent.
- 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