• ベストアンサー

Perlでロック不具合?

Perlを使用して、掲示板のようなものをつくり、ずっと稼動させていましたが、 今日、データが消えてしまいました。 データのファイルサイズがゼロになっていました。 ファイルの書込み時には、flockを使用してロックをかけています。 #--ロック flock LOCK,2; #--アンロック flock LOCK,8; どのような原因が考えられますでしょうか? flockが使用できることは、別途スクリプトを作って確認済みです。 環境 SuSE linux 9 Perl v5.8.3 書込みが最大で1日に30件程度 宜しくお願いします。

  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • bgbg
  • ベストアンサー率53% (94/175)
回答No.1

flockでファイルロックを制御できるのは、あくまでflockを使ったファイルハンドルだけです。 flockを使わないファイルアクセスにはロックが利きません。 ファイルの読み込み時にflockを使わずに読んでいませんか? flockを使ったファイル書き込み中にflockを使わないファイル読み込みがあった場合、flockを素通りして書きかけのファイルを読めてしまいます。 おそらくこれが今回ファイルが壊れた原因です。 これに対処するには書き込みだけでなく、読み込み時のファイルアクセスにもflockをかけるといいでしょう。 読み込み時は共有ロック( flock LOCK 1 )でいいでしょう。 また、バッファリングを無効にする( $| = 1 )にすることでファイル書き込みの途中でロックが解除されてしまう現象も回避できます。 あわせて対策しておくといいでしょう。

tomkeifer
質問者

お礼

回答ありがとうございます。 バッファを無効にする、というのは知らなかったです。参考になります。 で、言いづらいのですが、自己解決で、 サーバーのストレージの空きが0%になっていたことが原因でした。 お騒がせしてすみません。

関連するQ&A

  • ロック??

    データファイルとかは同時書き込みされると破損するみたいですね。 それを防ぐにはとうすりゃいんだ?と思い書籍(十日でおぼえるPerl講座)をみるとFlock関数を使えばいいとありました。 しかし自分が使っているスクリプトのロック関数は MkdirとSymlinkだけです。 これはどうすればいいんでしょうか?

  • ファイルロックの確認

    PHPで掲示板を作っています。バージョンは5? (php.exeファイルのバージョンは5.2.1.1です。) ファイルロックについて、下記2点を教えてください。 同時書き込みによるログファイルの破損を防ぐため、ロック専用ファイルによるロックとアンロックの仕組みを作りました。 正常に稼動しているか、以下の方法でチェックしました。 1.ブラウザを2つ開く 2.両方とも書き込みボタンを押すだけの状態にする 3.両方のブラウザ(フォーム)の「書き込み」ボタンをすばやく続けてクリックする この方法だと、3で2個のボタンをクリックする間のタイムラグがあり、“同時”書き込みは難しいように思います。 他に方法があるのでしょうか? ////////// ロックファイル:lock/lock.php(755) --<?php --$lockfile = '.lock/lock.txt'; --$fp = fopen($lockfile,"w"); --flock($fp,LOCK_EX); --?> アンロックファイル:lock/unlock.php(755) --<?php --fclose($fp); --?> ロック用ファイル:lock.txt(644) ロックディレクトリ:lock(755) 動作ファイル:bbs.php --<?php --require_once './lock/lock.php'; --掲示板の処理 --require_once './lock/unlock.php'; --?> ロックのファイルを別ディレクトリに置くことは可能でしょうか? 可能であれば、パーミッションはどのようにすればいいのでしょうか? 現状、前述の方法でログが破損するかチェックしても異常ありません。 また、ロック関連の記述を削除してチェックしても異常ありませんので、ロックが正常に稼動しているのかどうか確認できない状態です。 PHPは始めたばかりですので、おかしなことを言っている箇所もあるかもしれませんが、宜しくお願いします。

    • ベストアンサー
    • PHP
  • ファイルロックの仕方

    Perl5を使ってCGIを作っています。 環境としては、OSはLinuxです。 ファイルロックなんですが、flockを使うということはわかっているのですが、ファイルが壊れ難いファイルロックの書き方というのがあるのなら教えて欲しいと思って質問しました。 初心者なので、出来れば書き方・使い方を詳しく教えて頂けたらと思います。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • flockのタイミング

    掲示板のスクリプトを作っています。 ログは1行ごとに1記事分のデータが格納されているので、書き込み処理の場合は、 $lines = file("./log.dat"); としていったん配列にログを読み込み、 array_unshift($lines, $new_data); 等して、新しい記事のデータを配列の先頭に追加し、 $fp = fopen("./log.dat", "wb"); foreach ($lines as $line) { fputs($fp, $_); } fclose($fp); として、最終的にログに書き込みます。 Perlを扱っているときは(複数更新すべきログファイルがあったので)、別途ロックファイルを作ってそれに対してflockをかけるという方法を行っていましたが、今回はログファイルが1つであるのでそのログファイル自体にflockをかけようと思っています。 しかし、fileで最初にopenしているため、ファイルポインタが取得できず、flockをかけるタイミングは、本当の書き込み作業の部分(fopen)からかけるしかなさそうなのですが、これは危険ではないでしょうか? それと、マニュアルに、 注意: flock()は、ファイルポインタを必要とするため、 (fopen()へ引数"w"または"w+"を指定して)書き込 みモードでオープンすることにより丸めるファイルにアクセス保護する 特別なロックファイルを使用する必要があるかもしれません。 とかいてありますが、この意味がいまいちわからず、困惑しています。

    • ベストアンサー
    • PHP
  • PerlとPHPで同一ファイルをファイルロック

    PerlとPHPで同一のファイルを読み書きする必要があるのですが、ファイルロックする機構を作るには互いの言語でmkdirで対応したほうがよいのでしょうか? flock関数がPerlにもPHPにもありますが、これは、PHPのプロセスで実行したロックの状態をPerlで検知したり、または逆のことはできないのでしょうか? もしできないとするとmkdirで同一の機構を作ったほうが良い気もしますが、何か問題などは起きないでしょうか。

    • ベストアンサー
    • PHP
  • ファイルロックについて

    現在商品管理システムを自作してみようと頑張ってるところなのですが、ファイルロックで躓いてしまいました。flock()を使ってみたのですが同時に複数の処理(データの更新と書き込みを同時に行った場合等)が行われるとデータが消えてしまったりします。 皆様はどういった形でファイルロックをしてますか? これは安全だ! というようなロックってのはあるんでしょうか?

    • 締切済み
    • CGI
  • PHPスクリプトでperlスクリプト

    はじめまして。PHP初心者です。助け舟をお願いします。 PHPスクリプトで、formの表示からデータの受け取り→ファイルに書込み→終了画面の表示ができるスクリプトを書くことが出来ました。 これをphpスクリプト1とします。 POSTで受け取った変数を元に処理した変数を返すperlスクリプトがあります。 これをperlスクリプト1とします。 perlスクリプト1をphpスクリプトにすることは私には困難なため、phpスクリプト1のファイルに書き込む前に、perlスクリプト1を実行→返った変数をphpスクリプトで使用しファイルに書込み→終了画面の表示を行いたいです。 こんなことってできますか?

    • 締切済み
    • PHP
  • phpのlock処理について

    phpのlock処理について 頻繁に書き込みされるファイルが飛ばないようにロックをしているのですが、 (アクセスログを保存) phpのロック処理を調べていると 一方ではこれでよい、もう一方ではこれでは意味がないなど 色々な事が書かれており、いまいち理解できません。 wモードで開くと強固なロックは不可能なのでしょうか。 以下のようにしているのですが ロックの意味はないでしょうか。 //ロック専用ファイルを開く $flock=fopen("lock.txt","w"); //ロック専用ファイルをロック flock($flock,LOCK_EX); //書き込むファイルを連結して代入 $lineall = implode('', $lines); //書き込み用のファイルを開く $fp=fopen($log_file,"w"); fwrite($fp, $lineall); fclose($fp); //ロック用ファイルのロック解除 flock($flock, LOCK_UN); fclose($flock); プログラムが1から私が作成したものではなく、 ちょくちょく消えてしまうことからロック処理をしたいのと 処理の問題でwモードでの書き込みでないとどうもゴミが入ってしまうようですので (r+でやってみましたが空行などのゴミが沢山入ってしまいました) wモードでの強固なロック方法があればと思うのですが・・・。 お手数をおかけしますがご教授いただけますと幸いです。

    • ベストアンサー
    • PHP
  • ファイルロックについて

    こんばんわ、お世話になります。 Perlのファイルロックについて教えて下さい。 色々書き方があるようなのですが、私は下記のように 単純に書いています。 #// ファイルロック開始 flock(LOCK, 2); #// ファイルオープン open(LOG, ">>$data") or exit; #// ファイルへ書き出し print LOG "$now,$ip,$ls\n"; #// ファイルクローズ close(LOG); #// ファイルロック解除 flock(LOCK, 8); 原因かわからないのですが、アクセスが多数同時にあると 10分くらいレスが返ってこなくなったりすることがあるようです。 ファイルロックに精度とかあったりすのでしょうか? 単純に、コードが1500行くらい書いているので、やっている処理自体 重いのかもしれませんが、1アクセスの場合は問題なく返ってくるので どうなのかな…と思い、投稿しました。 論理ファイル(CSV)を呼んで、中のデータを絞り込んでいき その結果をPOSTするいったこと(100ファイル分くらい)をやって います。 ファイルロックによって、パフォーマンスが悪くなったりするのか、 どなたかご教授ください。お願いします。

    • ベストアンサー
    • Perl
  • ログの一部を消す Perl

    ログの一部を消すPerlを考えています。 ここではソースを短くするために、ログの一部を消し去って ログファイルに上書きするデータは $deta だけだとすると open F, '+<a.log'; flock F,2; $deta = <F>;//実際はここでもっと処理 truncate F,0; seek F,0,0; print F $deta; close F; と、 open IN, 'a.log'; flock IN,2; open OUT, '>a.log'; flock OUT,2; $deta = <IN>;//実際はここでもっと処理 print OUT $deta; close OUT; close IN; の2つを考えました。 上のように 読み込み と 書き込み を同時にやった方がいいのか 下のように分けてやった方がいいのか教えてください。 ロックは flock を使って、普通レベルのロックが できるぐらいでいいと思っているんだけど、 この flock の書き方でおかしいところがあれば 教えてください。

    • ベストアンサー
    • CGI

専門家に質問してみよう