2006年 10月 22

perlで排他処理(ファイルロック)を行う場合様々な方法があります。

昔のレンタルサーバの場合はflock()が使えない環境などがあり、
symlinkやmkdirを使った処理が多くありました。

しかし、スピード・信頼性に優れていて、現代どこのサーバ(Unix系の)でも使えるであろうflockを使わない手はないと思います。

flockなんか壊れる、信頼しない…使い方は間違っていませんか?

まずは各ロック方式の特徴を

■ symlink
・遅い。
・ロックしたままの状態(ロック用シンボリックリンク)が残る可能性がある。
・サーバーによっては使えない場合がある。

■ mkdir
・遅い。
・ロックしたままの状態(ロック用ディレクトリ)が残る可能性がある。
・処理全体をロックする場合に便利。
・どの環境でも使用できる。

■ flock
・速い。
・アンロックし忘れが無い。

■サンプルソース
flockは完了するまで永遠と処理を待ち続けるため10秒のアラーム処理を入れ10秒以内に完了しなければタイムアウトとしました。
この処理は強力でまずファイルが壊れる事はありません。

このファイルロックを使い、10万PV/日でも壊れませんでした。
ただし、ロック処理の間に他のファイルを開く時にはファイルハンドル(サンプルでは”FILEHANDLE”)を変える必要があります。

これを怠ると必ずファイルが壊れます。

#ロック処理開始
eval {
local $SIG{ALRM} = sub { die "timeout" };
alarm 10;#アラームを10秒に設定
#ログ読み込み&ロック
open(FILEHANDLE,"+<"); #読み書きモードでファイルオープン
flock(FILEHANDLE, 2);  #ロック確認 ロック
@data = <FILEHANDLE>; #@dataに読み込み
alarm 0;
};
alarm 0;#アラーム解除
if($@) {&error;}; # タイムアウト時の処理 別にsub errorが必要になる

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
#  ここにロック中に行う処理
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

seek(FILEHANDLE, 0, 0);  # ファイルポインタを先頭にセット
print FILEHANDLE @data;  # ファイルに書き込む
truncate(FILEHANDLE, tell(FILEHANDLE));  # ファイルサイズを書き込んだサイズにする
close (FILEHANDLE);  #closeで自動にロック解除

More from my site

  • DNSラウンドロビン サーバダウン等の障害時はどうなる?DNSラウンドロビン サーバダウン等の障害時はどうなる? DNSラウンドロビン? DNSのAレコードに A www 111.222.333.444 A www 555.666.777.888 と同じドメインに複数のIPアドレスを設定するとアクセスの度にローテーションしてIPアドレスを返してくれる。 これを用いて負荷分散などに利用出来る。 サーバダウン時にはどうなる? 古い文献によると、例えば上の例だと […]
  • CentOS5系にdovecot2をインストール MySQL,Postfix,CentOS5系にdovecot2をインストール MySQL,Postfix, スマートフォンでpush通知出来るようにIMAP-IDLE対応のdovecot2をインストールする。 基本的には メールサーバ構築のまとめ(複数のバーチャルドメイン+Postfix+MySQL+Dovecot+procmail+Clam AntiVirus+spamassassin+postfixadmin) […]
  • CentOS5.3 メールサーバ構築(Postfix +qmail +vpopmail +Dovecot) CentOS5.3 メールサーバ構築(Postfix +qmail +vpopmail +Dovecot) CentOSで自宅サーバー構築を参考に構築したが、途中でエラーが出たのでメモ。 19.独自のメールアドレスをつくる(Postfix編)メールサーバー構築(Postfix+Dovecot)CentOS4/CentOS5http://centossrv.com/postfix.shtmlバーチャルドメイン設定(Postfix&Dovecot+qmail&vpop […]
  • DNSのmxレコードでハマる。ValueDomain編DNSのmxレコードでハマる。ValueDomain編 ValueDomainの説明には ■mail.hoge.com(123.123.123.2)を***@test.hoge.comのメールサーバー(優先度10)としたい場合 mx mail 10 test a mail […]
  • CentOS5.3 PostfixをMySQL対応にするCentOS5.3 PostfixをMySQL対応にする 2013-01-13追記 MySQL対応のPostfixはCentOS Plusリポジトリを使えばyumでupdate出来るみたい。こっちの方がいいね。 CentOS Plusリポジトリを有効にする # vi /etc/yum.repos.d/CentOS-Base.repo [centosplus] name=CentOS-$releasever […]
  • Postfixでのバーチャルドメインの設定Postfixでのバーチャルドメインの設定 バーチャルドメインをPostfixで使う場合 /etc/postfix/virtual の編集が必要となる 参考文献http://vine-linux.ddo.jp/linux/mail/virtual.php

Filed under: perl,ファイル操作

Trackback Uri



コメントする