Stupid shell tricks

D J Hawkey Jr hawkeyd at visi.com
Mon Jul 21 05:26:03 PDT 2003


Hello all.

I'll cut right to it: I'm looking for a technique to do "atomic writes"
in a shell (sh(1)) script, playing with the trap builtin. It goes something
like this:

     1: #!/bin/sh
     2:
     3: trapper ()
     4: {
     5:    rm -f $TMPFILE
     6:    exit
     7: }
     8:
     9: trap trapper HUP PIPE INT QUIT SEGV
    10:
    11: ...
    12:
    13: while read LINE; do
    14:     trap "" HUP PIPE INT QUIT SEGV
    15:     binary_that_writes $LINE
    16:     ...
    17: done <$TMPFILE
    18:
    19: trapper

Line 9 sets up the general-case signal handler to have the script clean
up after itself. Line 11 is stuff where I want the signal handler to do
it's thing. Line 14 sets up the "atomic write" by ignoring the signals.
So far, so good. Line 16 is my problem; this is where I want something
so the script exits _without_ cleaning up when the signal that would
have been seen/caught at line 15 occurs.

The trap at line 14 is inside the loop 'cuz I figure line 16 will be
another trap statement, but I seem to be wrong about this. So far, if
the trap at line 14 is anything else, line 15 gets interrupted. Using
nohup(1) at line 15 (without the trap at line 14) doesn't trap enough
signals.

I've tried quite a few different signal things, but none have produced
what I'm after. Anyone been here and done that? Oh, yeah, it has to be
a portable solution, too.

Thanks,
Dave

-- 
  ______________________                         ______________________
  \__________________   \    D. J. HAWKEY JR.   /   __________________/
     \________________/\     hawkeyd at visi.com    /\________________/
                      http://www.visi.com/~hawkeyd/



More information about the freebsd-questions mailing list