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