【问题标题】:cgi perl - file timestamp does not be read correctlycgi perl - 文件时间戳无法正确读取
【发布时间】: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 strictuse warnings吗?
  • 你在 Perl 中引入 cmets 是用 # 而不是 // ...
  • 对不起,我只是复制了原始代码并减少了它。当然我没有在原始代码中使用//
  • "如果我设置use strict,我需要稍微重构一下我的代码。"我敢打赌,在这些重构过程中,你会修复这个错误。

标签: perl file cgi timestamp


【解决方案1】:

我在这里看到错字: $fileage = (-M $tfilename) * 24 * 60; // have the file age in minutes。没有像$tfilename这样的变量...

【讨论】:

  • 实际代码中没有错字,为了清楚起见,我重命名了一些变量。但是感谢您的提示,我在上面更正了!
  • 你能用更简单的代码版本复制这种行为吗?
猜你喜欢
  • 2014-06-22
  • 2020-03-26
  • 2021-07-10
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
相关资源
最近更新 更多