Sponsored Content
Top Forums Shell Programming and Scripting Getting exit status of child in trap handler Post 302205438 by rimon on Sunday 15th of June 2008 04:07:28 AM
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
 

10 More Discussions You Might Find Interesting

1. 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

2. 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

3. 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

4. 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

5. 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

6. 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

7. 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

8. 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

9. 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

10. 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
preap(1)							   User Commands							  preap(1)

NAME
preap - force a defunct process to be reaped by its parent SYNOPSIS
preap [-F] pid... DESCRIPTION
A defunct (or zombie) process is one whose exit status has yet to be reaped by its parent. The exit status is reaped via the wait(3C), waitid(2), or waitpid(3C) system call. In the normal course of system operation, zombies may occur, but are typically short-lived. This may happen if a parent exits without having reaped the exit status of some or all of its children. In that case, those children are reparented to PID 1. See init(1M), which periodically reaps such processes. An irresponsible parent process may not exit for a very long time and thus leave zombies on the system. Since the operating system destroys nearly all components of a process before it becomes defunct, such defunct processes do not normally impact system operation. However, they do consume a small amount of system memory. preap forces the parent of the process specified by pid to waitid(3C) for pid, if pid represents a defunct process. preap will attempt to prevent the administrator from unwisely reaping a child process which might soon be reaped by the parent, if: o The process is a child of init(1M). o The parent process is stopped and might wait on the child when it is again allowed to run. o The process has been defunct for less than one minute. OPTIONS
The following option is supported: -F Forces the parent to reap the child, overriding safety checks. OPERANDS
The following operand is supported: pid Process ID list. EXIT STATUS
The following exit values are returned by preap, which prints the exit status of each target process reaped: 0 Successfully operation. non-zero Failure, such as no such process, permission denied, or invalid option. ATTRIBUTES
See attributes(5) for descriptions of the following attributes: +-----------------------------+-----------------------------+ | ATTRIBUTE TYPE | ATTRIBUTE VALUE | +-----------------------------+-----------------------------+ |Availability |SUNWesu (32-bit) | +-----------------------------+-----------------------------+ | |SUNWesxu (64-bit) | +-----------------------------+-----------------------------+ SEE ALSO
proc(1), init(1M), waitid(2), wait(3C), waitpid(3C), proc(4), attributes(5) WARNINGS
preap should be applied sparingly and only in situations in which the administrator or developer has confirmed that defunct processes will not be reaped by the parent process. Otherwise, applying preap may damage the parent process in unpredictable ways. SunOS 5.10 26 Mar 2001 preap(1)
All times are GMT -4. The time now is 09:41 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy