2011-12-08 14 views
0

CGI環境でファイルのタイムスタンプに問題があります。cgi perl - ファイルタイムスタンプが正しく読み取られない

私のCGIスクリプトは、cronを一度毎分呼び出されます。

このCGIスクリプトは外部ソースからhttp経由でいくつかのテキストデータ(メッセージ)を取り出し、ファイルに書き込みます。 前に、このファイルの最終更新タイムスタンプをチェックし、ファイルの古い内容を読み取ります。 ファイルのタイムスタンプが古いより5分で、新しいメッセージが古いものと同一でない場合、私は

$fileage = (-M $filename) * 24 * 60; 

でファイルのタイムスタンプを読んでいる、それはいくつかの他のソースにそれを送信しません。

以下のコード部分を参照してください。

私の問題は今:スクリプトは、30〜50分間完全に1分ごとに実行されていると、突然、ファイル年齢は、ファイルがキャッシュされたかのように正しく読め取得しないように開始します。 正しいファイルの経過時間を返すのではなく、常に5〜7分程度でなければなりませんが、ファイルは10分、15分、20分などに増加します。

システムは、Linux 2.6.16.60-0.42.10-bigsmpで、Perlのバージョン:5.008008、Webサーバ: $fileage = (-M $tfilename) * 24 * 60; // have the file age in minutes: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"; 
} 
+0

などのVARいいえあなたはそこにいくつかのログを持っている - あなたのログには何が起こるかと言っていますか? –

+2

私はcronから呼ばれるCGIプログラムを書く理由を理解するのに苦労しています。 CGIプログラムとは何ですか?あなたの本当の問題については、 'use strict'と' use warnings'を有効にしてみましたか? –

+0

あなたはPerlで#を使用して#でコメントを紹介しています... – tadmc

答えて

0

私はここにタイプミスを参照してください。 $tfilename ...

+0

typoは実際のコードにはありません。わかりやすくするためにいくつかの変数の名前を変更しました。しかし、ヒントのおかげで、私は上にそれを修正! –

+0

より簡単なバージョンのコードでこの動作を複製できますか? –

関連する問題