こんにちは!
表題通り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で質問しましょう!
似たような質問が見つかりました
- au(KDDI) ■AU「 スマホトクするプログラム」について 4 2023/08/09 08:54
- PHP 掲示板を資料を参考にして開発中ですが、画像がアップされません? 1 2022/11/21 06:44
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- TOEFL・TOEIC・英語検定 2014年に購入した英文法書でTOIEC対策をしてもよいか? 1 2023/01/08 11:41
- Perl Windows10においての『Perl』のプログラムについて 1 2022/05/09 16:04
- その他(ブラウザ) このページは動作していません HTTP ERROR 401 2 2022/11/28 12:11
- Perl perlでリテラル値はメモリにどのように格納されているか? 1 2023/01/15 20:45
- その他(ネットショッピング・通販・ECサイト) アメリカの大手通販サイトiherbを普段利用中の方に質問です。 iherb歴7年のものです。 いつも 2 2022/06/10 13:59
- その他(コンピューター・テクノロジー) 50台の織機から回転数を取得・集計しモニターに表示したい 2 2022/11/05 15:48
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでCSVファイルを途中行まで...
-
openした後、closeしないでプロ...
-
エクセルVBA コードが同じでも...
-
ReadLineでの読み出し行を指定する
-
ExcelをCSV書き出す場合のシー...
-
perlで、後ろの行を読んで、前...
-
データファイルをプロットする(...
-
VBAでCSVファイルの特定行を書...
-
動画像から静止画を取り出すには
-
perlにて2つのファイル比較
-
Perlの変数に文字数制限(容量...
-
外部サーバーにあるファイルを...
-
C#でCSVファイルを逐一更新したい
-
sysread と read はバイナリ読...
-
データが消えてしまう
-
awkスクリプトでダブルクォーテ...
-
Perlで特定行から特定行までを...
-
Perlの初心者です。2重ループ...
-
csvファイルの横方向への改行に...
-
C言語の問題について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでCSVファイルを途中行まで...
-
VBAでCSVファイルの特定行を書...
-
openした後、closeしないでプロ...
-
ExcelをCSV書き出す場合のシー...
-
エクセルVBA コードが同じでも...
-
VBAで巨大なファイルの途中から...
-
ReadLineでの読み出し行を指定する
-
perlで、後ろの行を読んで、前...
-
JavaでCSVファイルを高速に読む...
-
MATLAB グローバル変数の宣言
-
perlにて2つのファイル比較
-
C言語でのファイルのデータ更...
-
拡張子 ”log” と ” dat” の違い
-
ADOによるCSVファイルからのデ...
-
2つのCSVファイルをマッチング
-
Perlの変数に文字数制限(容量...
-
VB6.0でDB接続する際に切断時の...
-
データファイルをプロットする(...
-
perlで容量の大きいCSVファイル...
-
Perl Vlookupみたいに
おすすめ情報