【发布时间】:2011-12-08 22:39:10
【问题描述】:
我对 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,Webserver: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";
}
【问题讨论】:
-
你有一些登录在那里 - 你的日志说发生了什么?
-
我很难理解你为什么要编写一个从 cron 调用的 CGI 程序。是什么使它成为 CGI 程序?至于你真正的问题,你试过打开
use strict和use warnings吗? -
你在 Perl 中引入 cmets 是用 # 而不是 // ...
-
对不起,我只是复制了原始代码并减少了它。当然我没有在原始代码中使用//
-
"如果我设置
use strict,我需要稍微重构一下我的代码。"我敢打赌,在这些重构过程中,你会修复这个错误。