Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!helios!bcm!convex!news From: tchrist@convex.COM (Tom Christiansen) Newsgroups: comp.unix.questions Subject: Re: redirected output is buffered, how do you flush it? Message-ID: <1991Feb05.000629.7401@convex.com> Date: 5 Feb 91 00:06:29 GMT References: Sender: news@convex.com (news access account) Reply-To: tchrist@convex.COM (Tom Christiansen) Organization: CONVEX Software Development, Richardson, TX Lines: 74 Nntp-Posting-Host: pixel.convex.com From the keyboard of rhoward@msd.gatech.edu (Robert L. Howard): :I have a script that after several pipe stops outputs a line :of information. When run from a tty it outputs a line every :few seconds to several minutes. Wrapped around the commands :is an infinite loop. I can specify a trap command that will :close up things gracefully (print summary info etc.). : :The problem comes in when I run: : :% script > some_file : :and then kill it some number of minutes later. The total output :of the script is still in some buffer somewhere and doesn't make :it to the file. Is there some command I can put in the 'trap' to :force it to flush the buffers? Or is there a recommended way to :kill the job (other than ^C) that will force the buffers to flush? This is a general problem that comes up often, and I don't know any way of doing it unless you can get the program doing the writes to flush its buffers now and then. If awk only had a way to force flushes, then it wouldn't be so rough; sadly, it doesn't. :Here is the script if you are wondering what I am talking about... : :------------------------------------------------------------------ :#! /bin/sh :# :pstat=/usr/etc/pstat : : :trap 1 2 3 14 15 : :echo "Starting at `date`" :echo "Interval is $1 seconds." :echo "" : :while true :do : $pstat -T | sed -e 's/\//\ /g' : sleep $1 :done | awk ' :/files/ { if ($1 > files) { : files = $1 : printf ("max files\t%5d out of %5d, or %6.2f%\n", \ : files, $2, 100*files/$2) } : }' - Here's a fairly direct translation of your program into perl, which does have a way to set buffering: if $| is non-zero, then output will be flushed after each print. It even looks a lot like your script. #!/usr/bin/perl $pstat='/usr/etc/pstat'; $nap = shift; # i like to name my args $| = 1; # auto-flush at end of print statements print "Starting at ", `date`; print "Interval is $nap seconds.\n\n"; while (1) { `$pstat -T` =~ /(\d+)\/(\d+) files/; # $1 and $2 get set here if ($1 > $files) { $files = $1; printf ("max files\t%5d out of %5d, or %6.2f%%\n", $files, $2, 100*$files/$2); } sleep $nap; } --tom -- "Still waiting to read alt.fan.dan-bernstein using DBWM, Dan's own AI window manager, which argues with you 10 weeks before resizing your window." ### And now for the question of the month: How do you spell relief? Answer: U=brnstnd@kramden.acf.nyu.edu; echo "/From: $U/h:j" >>~/News/KILL; expire -f $U