Getting exit status of child in trap handler


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Getting exit status of child in trap handler
# 1  
Old 06-15-2008
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:
Code:
#!/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:
Code:
#!/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
# 2  
Old 06-15-2008
this works -
Code:
#!/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.
# 3  
Old 06-16-2008
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.
# 4  
Old 06-16-2008
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.
# 5  
Old 06-17-2008
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:

Code:
function err_handler
{
        echo The child exited  with $?
}

trap err_handler CHLD

And I still got 0 as the value of $? .
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

Perl: trap signal 'exit': why I am not able to have it work??

First time trying to work with signals in Perl. Reviewing example I try it, but not able to get it work for 'exit'. I hope, I am correct, assuming, that the ending any code by exit $return_code; the $SIG{EXIT} should be de-referenced and processed?! So, I have such code, that, I assume,... (5 Replies)
Discussion started by: alex_5161
5 Replies

2. Shell Programming and Scripting

Kill child processes when exit

Hi, I have parent script which is invoking multiple child scripts. I would want to kill all the child processes before the parent process exit. > cat ./parent #!/bin/ksh while do . ./child arg1 & if ; then break fi done Is there a way to get the process group id for all the child... (3 Replies)
Discussion started by: midhun19
3 Replies

3. Shell Programming and Scripting

Track Child process exit

hi, I have a job that spawns multiple child processes in background.. Catch is i want to wait for some jobs to finish before i spawn more background processes. (each job creates a file and deletes at the end of it . so i don't want start new jobs after x amount of disk size is used up) now,... (2 Replies)
Discussion started by: ak_saravanan
2 Replies

4. Shell Programming and Scripting

Trap not working in orphaned child processes

I've search the various posts in these forums, but have not come up with a solution to my problem. I have a parent process that calls a child script, runs it in the background and the parent finishes - without waiting for the child process to complete. Inside the child, a trap is issued to trap... (6 Replies)
Discussion started by: HobieCoop
6 Replies

5. Programming

Why does my child process not exit?

Im sure it has something to do with the wait() call, but everything ive tried either leaves me with a zombie or with the exec executing indefinitely. switch(pid = fork()) { case -1:perror("fork failed"); exit(1); case 0: if(key == "cd") { execl("/bin/cd", "cd",... (2 Replies)
Discussion started by: p00ndawg
2 Replies

6. Shell Programming and Scripting

TRAP Command --use based on exit criteria

Hi all, I am using the trap command in my script, and I want it to trap the signal based on the exit code the script returns. can anybody tell me how can I use "if loop" for "trap" command. I want to print "terminated by user" if signal is SIGINT or 2 "failure" if signal is not 2 and not 0... (1 Reply)
Discussion started by: grep_me
1 Replies

7. UNIX for Dummies Questions & Answers

Exit from n th child shell

Hi, I am using ksh to write my shell script. I need to create multiple-level of nested sub shells in my script. Lets say I have at n th subshell. My question is how do I come out from there to main login shell. If I use 'exit' command then it is exiting from just one subshell and back to... (4 Replies)
Discussion started by: indra_saha
4 Replies

8. Programming

Usage of exit() inside a signal handler

Is it ok to use exit() inside a signal handler? I catch SIGUSR1 in a signal handler and I try to close a file and then exit. The result is inconsistent. Sometimes the process exit and sometimes it returns to the original state before the signal handler was invoked. Perhaps exit is not legal in... (8 Replies)
Discussion started by: Tuvia
8 Replies

9. UNIX for Advanced & Expert Users

Kill all child processes on trap

hi OS: Sun Solaris I have a scenario that when someone presses ctrl-c while executing a shell script, it should not just exit. it should kill all the child processes started by the running shell script only. I am executing many other scripts parallely which in turn fork off more... (2 Replies)
Discussion started by: rakeshou
2 Replies

10. Shell Programming and Scripting

Over-riding TRAP in Child

Hi, I'm using Ksh on HP 10.2. My parent shell script has ignored INT signal using trap command. trap "" 2 3 .... (other signals) This script calls another script in which INT signal should be active and should not be ignored. I browsed the net and found out that in ksh, once a... (1 Reply)
Discussion started by: anijog
1 Replies
Login or Register to Ask a Question