... sub do_log { ... sysopen my $fh, $logfile, O_RDWR|O_CREAT or do {...}; my $tmp_file = "${logfile}_tmp"; open my $tmp_fh, '>', "$tmp_file" or do {...}; if (flock $fh, LOCK_EX) { #exclusive lock while (<$fh>) { .. my $line = $_; .. print $tmp_fh $line, "\n"; } close $tmp_fh or die "Can't close tmp_file: $!"; move($tmp_file, $logfile); } close $fh or die "Can't close logfile $!"; #unlocks automatic }