dポイントプレゼントキャンペーン実施中!

こんにちは!
表題通りperl製CGIのファイルロックについてなのですが。
現在こちら(http://www1.plala.or.jp/bagi/labo/lock.html)
のファイルロックを使用させて頂いているのですが、数ヶ月に1度くらいの頻度でログが飛んでしまいます。
同時アクセスによって飛ぶ、というのは理解できるのですが、それにしては少し多いんじゃないかな?と思い質問させていただきました。

このプログラムに問題があるのか、それともやはり同時アクセスのせいなのでしょうか。

合わせて、もしオススメのファイルロックのプログラムがあれば、参考に紹介していただければと思います。

よろしくお願いいたします。

A 回答 (4件)

>ファイルが消失・破損というのはここではログの消失(データが真っ白になる)と同意義と考えて良いのでしょうか?



「データが真っ白になる」というのは曖昧な表現ですが、同じものです。

>という回答で良かったでしょうか

はい。でも申し訳ありませんが、それだけではやはり何とも言えないですね。

該当のロックロジックは、何らかのCGIに組み込むものだと思います。使い方が誤っているですとか、ログファイルの書き込み方に問題があるとか、そういった部分の不具合を想像してしまいます。。。

>このプログラムに問題があるのか、それともやはり同時アクセスのせいなのでしょうか。

最初のご質問に戻りますが、同時アクセスが起きてもロックロジックによってそれを回避するためのプログラムです。このご質問を伺うと、使い方をご理解されていないのではないかと想像してしまいます。。。

ヒントを少し。ログが飛ぶとはどのような状況でしょうか。追記モードでログファイルを作成するのであれば、ログの順序が狂うことはあっても、劇的にサイズが小さくなったり0バイトになってしまうような事はあまり無いと思うのですが・・・。

おかしくなったログからどのようにプログラムが動作した結果なのかを想像してみて下さい。

この回答への補足

ログが飛ぶ状況というのは不明です。
ただログを追記ではなく上書きしているので、そのタイミングなのかもしれません。
仰るとおり、おそらく使い方を間違えているのではないか、と・・・。
no4の補足にプログラムの流れを書いておきますので、もしよろしければアドバイスなどいただければと思います。

補足日時:2004/12/03 15:45
    • good
    • 0

多分ロックのかけ方が悪いのではないでしょうか。



ファイルを読み出すときから書き終わるまでロックをかけないとログが飛びます。

誰かがファイルにアクセスするときは必ずロックをかけ、処理が終わるまでほかの人の処理をさせなければ理論上はログが消えることはありません。
(ログの保全を最優先に考えるのならばファイル読み込みだけでもロックをかけたほうがよい)

ロックにこだわらなければログの保全として、追記書込みモードを使用するとか、バックアップファイルを作って読み書きするたびにバックアップとのデータチェックをすれば損失は最小限になるかと思います。

この回答への補足

そうかもしれません。
バックアップファイルの作成についても考えた方がいいかもですね。
=====

一応流れをまとめてみましたので、こちらへのレスで失礼して、載せてみます。
最近巷に流れてます拍手のシステムを参考に自作したものです。
プログラム自体をお見せするのはやぶさかではないので、簡潔で申し訳ありませんが…。
該当しそうな辺りだけプログラムを書いておきます。

ロックモードのチェック
↓ロックしてない
ロックのサブルーチン呼び出し
ファイルの読み込み
ログデータの分割
現在日時を取得
ログに現在時が無かった場合、ログを新規作成
古いログ削除
$day = $log_lim-1;
&getday;
for($i=0;$i<=$#logdata;$i++){
($logdate,$xxx) = split(/<>/,$logdata[0]);
if ($logdate < $getdate){shift @logdata;}
}
カウントをログに加算
$log[$hour] ++;
$logtotal ++;
保存用ログの用意
$data = "$getdate<>$ipadd<>$logtotal<>";
for ($i=0 ; $i<=23 ; $i++){
$data = "$data$log[$i]<>";
}
$logdata[$#logdata] = "$data\n";
ファイルに保存
open(OUT,">$logfile") || &result("open_error");
eval{flock(OUT,2)};
print OUT @logdata;
close(OUT);
送信後画面の処理
一言メッセジがあった場合の処理
ロック解除
終了

ちなみにログはこんな感じのです。
041201<>IPアドレス<>2<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>2<>0<>
041202<>IPアドレス<>3<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>3<>0<>0<>
041203<>IPアドレス<>2<>1<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>1<>0<>0<>0<>0<>0<>0<>0<>0<>0<>

一言メッセージのログは特に消えたことはないので問題は無いかと思うのですが…。
なんかすごいポカミスしてそうな気がしてお恥ずかしいのですが^^;

補足日時:2004/12/03 15:47
    • good
    • 0
この回答へのお礼

遅くなりましたがその後の報告です。
ログファイルへは2つのCGIからアクセスしていて、もう一方でログを作成する時にロックをするのを忘れていたみたいです^^;
もう一方は一人しかアクセスしないから(admin)別にいいのかな、て思ってましたがそんな筈ないですよね。すいません、ケアレスミスです…。直したらやはりログが飛ぶ回数が減った気がします。

みなさんの仰るとおり、状況や、ロックの該当場所を一つ一つ確認することで解決できました。以後気をつけます。
ありがとうございました!

お礼日時:2005/02/15 10:04

>同時アクセスによって飛ぶ、というのは理解できるのですが、



同時アクセスによってファイルが消失・破損するのであれば、それはロックではありません。

また当然ながら、貴方の使用環境と貴方が紹介しているロックCGIのどのロックモードを使用したのかを表記して頂かねば、何も判断できません。

この回答への補足

失礼致しました。
helonpaさんのおっしゃるファイルが消失・破損というのはここではログの消失(データが真っ白になる)と同意義と考えて良いのでしょうか?それともまた別の意味合いでのお話でしょうか。
(すいません、意味が二通り取れたので…)

ファイルロックの形式はflock、
環境はOSがRedhat Linux、ウェブサーバがApache1.3.xxです。
(という回答で良かったでしょうか)

補足日時:2004/12/01 21:06
    • good
    • 0

Perlにファイルロックの命令がありそれを使えば問題が起こるリスクは減らせますが、限界があり処理の間と間にロックの命令がすり抜けるタイミングは存在しております。

<おそらくそれがおきて消えているのではないかと・・・


ちなみにUNIXベースだとOS側でファイルのロックしないので インターネット上の掲示板が飛ぶのはよくアリコとです。
逆にWindowsはOS側でファイルのロックを自動的にするので 損失するリスクは実は少ないのです。

Perlを使うなら ファイルロックの命令は確実にさせ
ログを一つのファイルに集約しない方法でやれば
まず、消えません。
    • good
    • 0
この回答へのお礼

windowsがロックに優れている(勝っている?)のは初耳です。そうだったのですか…。

とにかくもう一度ロックの流れの確認と、
ログを1つのファイルにしない方法を考えて見ます。
ありがとうございました!

お礼日時:2004/12/03 15:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!