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