Несколько проблем здесь:
1.
Настоятельно рекомендуется использовать трех-аргументную форму open и использовать локальную переменную вместо FILEHANDLE, которая будет загрязнять ваше глобальное пространство имен, поэтому вместо
open (FILE_CURVE, 'fit.log') or die;
use
open(my $fh, '<', 'fit.log') or die;
while(<$fh>){
}
close($fh);
2.
Удаление файла с открытым дескриптором файла не «действительно» удаляет его, и если вы читаете из дескриптора файла «удалено»msgstr "файл, вы просто будете читать из старого файла.Файлы действительно удаляются, когда удаляются все ссылки на них, включая открытые файловые дескрипторы, что может занять некоторое время.Вы можете рассмотреть одну стратегию:
sleep 1 while ! -f $path_to_logfile; # sleep until the file exists
3.
Существует библиотека для того, что вы хотите.
Извлечение File :: Tail и Filesys :: Notify :: Simple
- EDIT -
На основев ваших комментариях я бы предположил, что происходит что-то подобное:
Предполагается, что два агента:
a producer (gnuplot) that writes to the log file
a consumer (your script) that reads from the log file
производитель запускает
1.1 пишет вфайл журнала
потребитель запускается
2.1 удаляет файл журнала
2.2 открывает файл журнала для чтения
2.3 не находит строк для чтения
2,4 выхода
Если это так, то, удалив файл 2.1, в который производитель все еще записывает сообщения журнала, вы создаете ситуацию, когдапроизводитель пишет в «висячий» файл, который был удален из файловой системы, но в котором все еще есть открытый дескриптор.
Затем, когда вы открываете журнал в 2.2, файл воссоздается какпустой файл, который означает, что ваш цикл while не найдет ни одной строки и ваша печать не будет выполнена.
Я бы порекомендовал либо:
запустите потребителя, прежде чем запускать производителя, и подождите, пока файл журнала не будет создан, чтобы попытаться открыть его (с помощью приведенной выше команды sleep), или
сначала запустите производителя, но не удаляйте файл журнала в приемнике.