The UNIX and Linux Forums  


Go Back   The UNIX and Linux Forums > Top Forums > Shell Programming and Scripting
.
google unix.com



Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here.

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Kill all child processes on trap rakeshou UNIX for Advanced & Expert Users 2 06-12-2008 07:56 AM
How to get the exit status yhacks Shell Programming and Scripting 1 05-19-2008 09:06 AM
Status of child job after parent is killed anjul_thegreat High Level Programming 7 06-29-2007 07:36 AM
Over-riding TRAP in Child anijog Shell Programming and Scripting 1 06-23-2004 11:11 AM
ftp exit status. oracle8 UNIX for Advanced & Expert Users 1 10-22-2001 12:34 AM

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Search this Thread Rate Thread Display Modes
  #1 (permalink)  
Old 06-15-2008
rimon rimon is offline
Registered User
  
 

Join Date: Oct 2007
Posts: 15
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 (permalink)  
Old 06-15-2008
jim mcnamara jim mcnamara is online now Forum Staff  
...@...
  
 

Join Date: Feb 2004
Location: NM
Posts: 5,773
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 (permalink)  
Old 06-16-2008
rimon rimon is offline
Registered User
  
 

Join Date: Oct 2007
Posts: 15
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 (permalink)  
Old 06-16-2008
era era is offline Forum Advisor  
Herder of Useless Cats (On Sabbatical)
  
 

Join Date: Mar 2008
Location: /there/is/only/bin/sh
Posts: 3,652
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 (permalink)  
Old 06-17-2008
rimon rimon is offline
Registered User
  
 

Join Date: Oct 2007
Posts: 15
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 $? .
Closed Thread

Bookmarks

Tags
linux, linux commands, ubuntu

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On




All times are GMT -4. The time now is 04:16 PM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited. Language Translations Powered by .
vBCredits v1.4 Copyright ©2007 - 2008, PixelFX Studios
The UNIX and Linux Forums Content Copyright ©1993-2009. All Rights Reserved.Ad Management by RedTyger

Content Relevant URLs by vBSEO 3.2.0