У меня проблема с временными метками файлов в среде CGI.
Мой cgi-скрипт вызывается cron раз в минуту.
Этот скрипт cgi извлекает некоторые текстовые данные (сообщения) через http из внешнего источника и записывает их в файл.
Перед этим он проверяет отметку времени последнего изменения этого файла и считывает старое содержимое файла.
Я читаю метку времени файла с
$fileage = (-M $filename) * 24 * 60;
Если временная метка файла старше 5 минут, а новое сообщение не идентично старому, оно отправляет его в другой источник.
См. Фрагменты кода ниже.
Моя проблема сейчас: Сценарий работает идеально раз в минуту в течение 30-50 минут, а затем внезапно возраст файла начинает читаться неправильно, как если бы файл был кэширован.
Вместо того, чтобы возвращать правильный возраст файла, который всегда должен составлять около 5-7 минут, возраст чтения файла увеличивается до 10 минут, 15 минут, 20 минут и т. Д., Хотя файл записывается постоянно каждые несколько минут.
Система представляет собой Linux 2.6.16.60-0.42.10-bigsmp, версия Perl: 5.008008, веб-сервер: Apache 2
use CGI;
[...]
my $cgi = new CGI;
[...]
$fileagetolerance = 5;
$filename = "message.txt";
$newmessage = .... read via http from other website ...; # this message changes most of the time every few minutes.
$fileage = (-M $filename) * 24 * 60; # have the file age in minutes
print "file age of ".$filename.": ".$fileage.", minimum value needed for special action: ".$fileagetolerance."<br>\n";
if ( open( FILE, "<", $filename ) ) {
$lastmessage = <FILE>;
close (FILE);
} else {
print "Couldn't read last message. Exiting<br>\n";
die;
}
if ($newmessage eq $lastmessage) {
print "Last message is identical with new message. Exiting...<br>\n";
die;
}
if ($fileage < $fileagetolerance) {
print "Last message was not long enough ago. Exiting...<br>\n";
die;
}
sendItOut($newmessage);
if ( open( FILEOUT, ">", $filename ) ) {
print FILEOUT $newmessage;
close (FILEOUT);
print "Done.<br>\n";
} else {
print "Couldn't write last message.<br>\n";
}