Need help with trap

My problem is this:

I need to have a catch-all for my processes. An example would be, using a trap, in the parent, to catch any non-0 exit or invalid command (a way to catch core dumps would be cool, too) in not only the parent, but it's children and they're children. Not only that, but I also have to be able to have the same functionalith on anything that the parent or children dot in (functions containted in seperate files). Currently I can only get the trap to operate correctly on one level - parent/child. Also, it doesn't seem like I can create some sort of trap function in a seperate trapfuncs file and have it work. I dot it in and it never sees anything go wrong.

I'd really appreciate any help I could get on this. I'm stuck and can't figure this out for the life of me. I know one of gurus out there must have the answer. P.S. I'm open to any alternatives that don't mean putting blocks of code in every sinlge script and file.

Thanks!

A bit more information would help...

What flavor of UNIX?
Is this a shell script or C program?
If shell script, what shell (sh, ksh, bash, csh)?

In shell's such as bash and ksh, if you execute another
shell script, a new shell is spawned to execute it and
your "trap"s are set to their original values when a child process
is created.

In general, child processes that dump core should return
the value of 127+signal

I don't know if any of this helps but if you can provide more
details of what you have, maybe I (and others) can be of more
help. :slight_smile:

I'm running on AIX, model 000111924C00 (if it helps at all), and when I do a uname -v I get 4. I think we may be running an IBM version or something because 4 seems really low. I'm primarily concerned with shell scripts (all are ksh and dtksh) with minor concerns for C, C++ and COBOL. The minor concers are very minor, though.

I'm not sure how I would trap a value of 127. I thought I could only trap 1-15 and ERR. Would ERR catch the 127?

I hope that this info helps. Please let me know if I can help clear anything up. I really appreciate the help.

OK. AIX and ksh helps my understanding.
If you run... kill -l
...on AIX 4.3.3 you get some 40 distinct signals
you can trap.
The ERR trap will fire whenever a command has
a non-zero return value. Note that this trap
is not inheritied by functions. And of course,
if you execute another shell script, a new shell is spawned to execute it and your "trap"s are set to their original values when a child process
is created.

The 128+signal stuff only applies to the
return value variable "$?" which when a program
is terminated by a signal (i.e. SEGV, BUS, etc)
and dumps core, the value of this signal + 128
is returned in $?

The short of it is... if you want to assure
proper signal handling in your shells, you
should have traps in all your scripts.

:frowning:

in ksh you could do something like this:

#!/usr/bin/ksh
# Functions
function trap_cmd {
echo "Ack, I've been whacked!"
exit 2
}
function trap_segv {
echo "Uh oh, segmentation fault... we may have just dumped core."
exit 127
}
# Error handling
trap 'trap_cmd' 1 2 3 4 5 6 7 8 9 10 12 13 14 15 19 20
trap 'trap_segv' 11
# Dummy command... interrupt with ^C, ^\, ^Z or kill it...
while `true`
do
sleep 5
done

I hope that helps with the handling of multiple different signals, and with placing a function with the trap...

Oh, BTW, these signals are from Linux's kill... yours may vary...

Thanks! It looks like this will help. I'm going to try a few things and post back.

Thanks, again, for your help.

Thanks a lot! I put the stuff into some functions and everything is working well. The only caveat is that I have to dot the function file into every script (children included) so that it woks correctly.

Thanks again for your help.

If you're using ksh, you can use a cool little option called autoload!

Create a file with the function name, write the function in it, then add:
autoload my_file
at the top of the script. For example:

$
$cat > trap_cmd
function trap_cmd {
echo "Ack, I've been whacked!"
exit 2
}
^D
$
$vi my.script
#!/usr/bin/ksh
autoload trap_cmd
[...]

Or, simple create a large file with all of your functions in it, say, named function_load, then add:

. /path/to/function_load

to your script...

It'll save you a little typing.