Date: Mon, 21 Jul 2003 07:25:57 -0500 From: D J Hawkey Jr <hawkeyd@visi.com> To: questions at FreeBSD <freebsd-questions@freebsd.org> Subject: Stupid shell tricks Message-ID: <20030721122557.GA6212@sheol.localdomain>
next in thread | raw e-mail | index | archive | help
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@visi.com /\________________/ http://www.visi.com/~hawkeyd/
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030721122557.GA6212>