こんにちは!
表題通りperl製CGIのファイルロックについてなのですが。
現在こちら(http://www1.plala.or.jp/bagi/labo/lock.html)
のファイルロックを使用させて頂いているのですが、数ヶ月に1度くらいの頻度でログが飛んでしまいます。
同時アクセスによって飛ぶ、というのは理解できるのですが、それにしては少し多いんじゃないかな?と思い質問させていただきました。
このプログラムに問題があるのか、それともやはり同時アクセスのせいなのでしょうか。
合わせて、もしオススメのファイルロックのプログラムがあれば、参考に紹介していただければと思います。
よろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
>ファイルが消失・破損というのはここではログの消失(データが真っ白になる)と同意義と考えて良いのでしょうか?
「データが真っ白になる」というのは曖昧な表現ですが、同じものです。
>という回答で良かったでしょうか
はい。でも申し訳ありませんが、それだけではやはり何とも言えないですね。
該当のロックロジックは、何らかのCGIに組み込むものだと思います。使い方が誤っているですとか、ログファイルの書き込み方に問題があるとか、そういった部分の不具合を想像してしまいます。。。
>このプログラムに問題があるのか、それともやはり同時アクセスのせいなのでしょうか。
最初のご質問に戻りますが、同時アクセスが起きてもロックロジックによってそれを回避するためのプログラムです。このご質問を伺うと、使い方をご理解されていないのではないかと想像してしまいます。。。
ヒントを少し。ログが飛ぶとはどのような状況でしょうか。追記モードでログファイルを作成するのであれば、ログの順序が狂うことはあっても、劇的にサイズが小さくなったり0バイトになってしまうような事はあまり無いと思うのですが・・・。
おかしくなったログからどのようにプログラムが動作した結果なのかを想像してみて下さい。
この回答への補足
ログが飛ぶ状況というのは不明です。
ただログを追記ではなく上書きしているので、そのタイミングなのかもしれません。
仰るとおり、おそらく使い方を間違えているのではないか、と・・・。
no4の補足にプログラムの流れを書いておきますので、もしよろしければアドバイスなどいただければと思います。
No.4
- 回答日時:
多分ロックのかけ方が悪いのではないでしょうか。
ファイルを読み出すときから書き終わるまでロックをかけないとログが飛びます。
誰かがファイルにアクセスするときは必ずロックをかけ、処理が終わるまでほかの人の処理をさせなければ理論上はログが消えることはありません。
(ログの保全を最優先に考えるのならばファイル読み込みだけでもロックをかけたほうがよい)
ロックにこだわらなければログの保全として、追記書込みモードを使用するとか、バックアップファイルを作って読み書きするたびにバックアップとのデータチェックをすれば損失は最小限になるかと思います。
この回答への補足
そうかもしれません。
バックアップファイルの作成についても考えた方がいいかもですね。
=====
一応流れをまとめてみましたので、こちらへのレスで失礼して、載せてみます。
最近巷に流れてます拍手のシステムを参考に自作したものです。
プログラム自体をお見せするのはやぶさかではないので、簡潔で申し訳ありませんが…。
該当しそうな辺りだけプログラムを書いておきます。
ロックモードのチェック
↓ロックしてない
ロックのサブルーチン呼び出し
ファイルの読み込み
ログデータの分割
現在日時を取得
ログに現在時が無かった場合、ログを新規作成
古いログ削除
$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<>
一言メッセージのログは特に消えたことはないので問題は無いかと思うのですが…。
なんかすごいポカミスしてそうな気がしてお恥ずかしいのですが^^;
遅くなりましたがその後の報告です。
ログファイルへは2つのCGIからアクセスしていて、もう一方でログを作成する時にロックをするのを忘れていたみたいです^^;
もう一方は一人しかアクセスしないから(admin)別にいいのかな、て思ってましたがそんな筈ないですよね。すいません、ケアレスミスです…。直したらやはりログが飛ぶ回数が減った気がします。
みなさんの仰るとおり、状況や、ロックの該当場所を一つ一つ確認することで解決できました。以後気をつけます。
ありがとうございました!
No.2
- 回答日時:
>同時アクセスによって飛ぶ、というのは理解できるのですが、
同時アクセスによってファイルが消失・破損するのであれば、それはロックではありません。
また当然ながら、貴方の使用環境と貴方が紹介しているロックCGIのどのロックモードを使用したのかを表記して頂かねば、何も判断できません。
この回答への補足
失礼致しました。
helonpaさんのおっしゃるファイルが消失・破損というのはここではログの消失(データが真っ白になる)と同意義と考えて良いのでしょうか?それともまた別の意味合いでのお話でしょうか。
(すいません、意味が二通り取れたので…)
ファイルロックの形式はflock、
環境はOSがRedhat Linux、ウェブサーバがApache1.3.xxです。
(という回答で良かったでしょうか)
No.1
- 回答日時:
Perlにファイルロックの命令がありそれを使えば問題が起こるリスクは減らせますが、限界があり処理の間と間にロックの命令がすり抜けるタイミングは存在しております。
<おそらくそれがおきて消えているのではないかと・・・ちなみにUNIXベースだとOS側でファイルのロックしないので インターネット上の掲示板が飛ぶのはよくアリコとです。
逆にWindowsはOS側でファイルのロックを自動的にするので 損失するリスクは実は少ないのです。
Perlを使うなら ファイルロックの命令は確実にさせ
ログを一つのファイルに集約しない方法でやれば
まず、消えません。
windowsがロックに優れている(勝っている?)のは初耳です。そうだったのですか…。
とにかくもう一度ロックの流れの確認と、
ログを1つのファイルにしない方法を考えて見ます。
ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでCSVファイルを途中行まで...
-
VBAでCSVファイルの特定行を書...
-
ExcelをCSV書き出す場合のシー...
-
エクセルVBA コードが同じでも...
-
拡張子 ”log” と ” dat” の違い
-
CSVが可変長の場合の検索方法
-
csvファイル改行コードの置換に...
-
VBAで巨大なファイルの途中から...
-
VBScriptでファイル保存先のデ...
-
検索ボックスから製品名を検索...
-
ファイルロックのおすすめプロ...
-
Perlの変数に文字数制限(容量...
-
エクセルVBAでCSVファイ...
-
openした後、closeしないでプロ...
-
MATLAB グローバル変数の宣言
-
C言語でのファイルのデータ更...
-
close()で例外が投げられる理由
-
awkスクリプトでダブルクォーテ...
-
エクセルVBAで素数だけを出力す...
-
vba dir の相対パス
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでCSVファイルを途中行まで...
-
エクセルVBA コードが同じでも...
-
VBAでCSVファイルの特定行を書...
-
ExcelをCSV書き出す場合のシー...
-
ReadLineでの読み出し行を指定する
-
openした後、closeしないでプロ...
-
JavaでCSVファイルを高速に読む...
-
VBAで巨大なファイルの途中から...
-
拡張子 ”log” と ” dat” の違い
-
csvファイル改行コードの置換に...
-
C言語でのファイルのデータ更...
-
VB6.0でDB接続する際に切断時の...
-
Perlの変数に文字数制限(容量...
-
Perl Vlookupみたいに
-
CSVファイルについて
-
MATLAB グローバル変数の宣言
-
エクセルVBAでCSVファイ...
-
VBScriptでファイル保存先のデ...
-
Monster'sの改造・・・ボスモン...
-
perlで、後ろの行を読んで、前...
おすすめ情報