Why the 30-second pause after executing this script?
Jilles Tjoelker
jilles at stack.nl
Tue Apr 13 03:51:30 PDT 2004
On Mon, Apr 12, 2004 at 05:04:34PM -0400, Alex Vasylenko wrote:
> Kirk Strauser wrote:
> >to attach to a jail to execute /etc/rc.shutdown. I've noticed that this
> >works as expected, unless its output is being piped into another program,
> >in
> >which case 'sh' waits about 30 seconds after the 'exit 0' line is executed
> >before closing its end of the pipe. For example:
> /etc/rc.shutdown kills the _shell_ of the watchdog timer instead of the
> timer itself, so the timer keeps going. Please try the patch attached.
> - sleep $rcshutdown_timeout && (
> + exec sleep $rcshutdown_timeout && (
This means that the part after && is never executed, invalidating the
whole purpose of the watchdog!
It would be easiest if sh had a builtin similar to the alarm(3) C
function, but I can think of complicated setups with trap and wait.
Another option is to close the stdin/stdout/stderr in the watchdog (this
doesn't seem very satisfying though):
diff -u -r1.25 rc.shutdown
--- etc/rc.shutdown 8 Jul 2003 02:52:14 -0000 1.25
+++ etc/rc.shutdown 12 Apr 2004 20:55:51 -0000
@@ -66,7 +66,7 @@
_rcshutdown_watchdog=
if [ -n "$rcshutdown_timeout" ]; then
debug "Initiating watchdog timer."
- sleep $rcshutdown_timeout && (
+ exec 0<>/dev/tty 1>&0 2>&1 && sleep $rcshutdown_timeout && (
_msg="$rcshutdown_timeout second watchdog" \
" timeout expired. Shutdown terminated."
logger -t rc.shutdown "$_msg"
Note that I haven't tested anything of this.
Also note that the behaviour of 'time cmd1 | cmd2' differs quite a lot
between shells.
--
Jilles Tjoelker
More information about the freebsd-current
mailing list