You don't have to close the filehandle to commit its output to disk. First, make sure you're flushing to the disk on every write, either by setting
$| or with
IO::Handle::flush. Then, to ask the OS to actually write the data to disk, use
IO::Handle::sync. This may slow you down significantly, simply because disks are slow compared to memory, but the hit is probably less than a
close/
open.
It's up to you to find the right tradeoff between the speed of your code and how much data is lost in the event of an unclean shutdown.
One other thought: you can install all the signal handlers you want, but until there's a $SIG{TRIPPED_OVER_POWER_CORD}, that won't be foolproof.