【Perl】ファイルロック(排他処理)について語ろう
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/06/23 10:18ID:eY2l+Gw10008nobodyさん
02/06/23 11:40ID:eY2l+Gw1http://www1.plala.or.jp/bagi/labo/lock.html
0009nobodyさん
02/06/23 11:47ID:???0010nobodyさん
02/06/23 11:48ID:???ファイルロック関数flockを使用して対象のファイルを直接ロックする。
特徴
・速い。
・アンロックし忘れが無い。
・ファイル毎のロックに便利。
・処理全体をロックする場合には不向き。
・flockが使えない環境もある。
flock(ロック用ファイルをロック)
ファイルロック関数flockを使用して別途用意したロック用ファイルをロックする。
特徴
・速い。
・アンロックし忘れが無い。
・処理全体をロックする場合に便利。
・ロック用ファイルが常に残る。
・サーバーによってflockが使えない場合がある。
symlink
シンボリックリンク関数symlinkを使用してロック用のシンボリックリンクを作成し、 シンボリックリンクの有無によりロック状態を判断する。
特徴
・遅い。
・ロックしたままの状態(ロック用シンボリックリンク)が残る可能性がある。
・処理全体をロックする場合に便利。
・サーバーによってsymlinkが使えない場合がある。
mkdir
ディレクトリ作成関数mkdirを使用してロック用のディレクトリを作成し、 ディレクトリの有無によりロック状態を判断する。
特徴
・遅い。
・ロックしたままの状態(ロック用ディレクトリ)が残る可能性がある。
・処理全体をロックする場合に便利。
・どの環境でも使用できる。
flock(対象ファイルを直接ロック)
ファイルロック関数flockを使用して対象のファイルを直接ロックする。
特徴
・速い。
・アンロックし忘れが無い。
0011nobodyさん
02/06/23 11:48ID:???0012nobodyさん
02/06/23 11:48ID:???とほほ 1999/03/30(火) 00:16:25
昔、UNIXのカーネルで飯を食っていました経験から判断すると・・・
(あくまでBSD系、SystemV系UNIXでの話です。NTは知らない。)
symlink, mkdir, flockはいずれも、ロックを『かける』ことに関して
は完璧。OSがちゃんと排他制御してくれる。
「symlinkで作られたファイルが在る状態でsymlinkを使う」って言う
のを、「symlinkが衝突する」と呼ぶのであれば、この「衝突」を検出
することによってロック権を奪ったか、奪えなかったかを判断している
のであり、衝突は正常動作の範囲。
symlinkとmkdirの違いは、mkdirだと、Windowsでも利用できるという
ことくらいしかない。信頼度は同じ。
ただし、symlink, mkdirはロックを『はずす』時に問題があり、ロッ
ク中にプロセスが異常終了したりすると、ロックファイルが残ったま
まになる。
その点、flockはロックを『はずす』時も完璧で、たとえプロセスが異
常終了しても、OSがストールしても、ロックが残ることは有り得ない。
信頼性ではsymlink, mkdirよりもflockの方が高い。ただしflockは、
UNIXでもサポートしていないOSがある。
しかし、flockでも(symlink, mkdirでも)ファイルが壊れることはあ
る。これは、ロック権を持ったプロセスが中途半端に書き込んでいる最
中に異常終了するなど、ロックとは無関係の原因で発生する。
もちろん、OSやperlのバグは考えていません。バグのことを考えても、
symlink, mkdir, flockのバグの発生頻度は同じようなものでしょう。
flock使えるんなら素直に使っとけ。
0013nobodyさん
02/06/23 12:31ID:???0015nobodyさん
02/06/23 13:10ID:???またまたぁ、そんなこといっちゃってー。
きみだって単発スレにレスしてるじゃん?コーディングスレあるだろ
0016nobodyさん
02/06/23 13:34ID:???そんなあなたも単発スレにレスしてるんじゃないの?コーディングスレあるだろ
0017nobodyさん
02/06/23 13:59ID:???http://www.jp.qmail.org/q103/jman5/maildir.html
> NFSの実装によっては信頼できるロックをまったく持っていません。
なんてのもあるし、lockdが刺さったらしいという経験もあるんで、どうしてもflockは避けちまう。
0019nobodyさん
02/06/23 17:37ID:eY2l+Gw1コレのロックっていいんですか?
0021nobodyさん
02/06/23 17:44ID:???0022nobodyさん
02/06/23 19:15ID:???0023nobodyさん
02/06/23 19:51ID:???・単発スレ=スレが伸びればよし、伸びなければ自然消滅
区別しろよ。。。
ロック時に rename ってのはダメ?
if( rename( 元ファイル名, ロック中ファイル名 )){
処理・・・・
}
みたいなのは
002624
02/06/23 22:26ID:???ありがとう。mkdirやsymlinkはよく見かけるけど、renameってのは
みないから、おれが根本的になにか勘違いしてるのかと思ってました。
0028nobodyさん
02/06/24 01:46ID:???http://www.google.co.jp/search?q=rename+%E6%8E%92%E4%BB%96%E5%88%B6%E5%BE%A1&ie=UTF-8&oe=UTF8&hl=ja&lr=
ん?renameだって普通にそこらへんにあるよ?
0030nobodyさん
02/06/24 07:20ID:???0032nobodyさん
02/06/24 13:52ID:???特徴
・むちゃくちゃ遅い
・アンロックし忘れがない
・処理全体をロックする場合に便利
・どの環境でも使用できる
#Lock.pm
package Lock;
use strict;
use File::Spec;
sub new{
my($class, %opt) = @_;
my %lfh = (
dir => ($opt{lockdir} || $opt{dir} || 'lock'),
file => ($opt{lockfile} || $opt{file} || 'lockfile'),
timeout => ($opt{timeout} || 60),
trytime => ($opt{trytime} || 10),
);
$lfh{path} = File::Spec->catfile($lfh{dir}, $lfh{file});
for(my $i = 0; $i < $lfh{trytime}; $i++, sleep(1))
{
return bless \%lfh => $class if(rename($lfh{path}, $lfh{current} = $lfh{path} . time));
}
local *LOCKDIR;
opendir(LOCKDIR, $lfh{dir}) or return undef;
while(my $file = readdir(LOCKDIR)){
if ($file =~ /^$lfh{file}(\d+)/){
return bless \%lfh => $class if (time - $1 > $lfh{timeout}
and rename(File::Spec->catfile($lfh{dir}, $file) => $lfh{current} = $lfh{path} . time));
last;
}
}
closedir LOCKDIR;
return undef;
}
sub DESTROY{ rename $_[0]->{current} => $_[0]->{path};}
1;
__END__
0033nobodyさん
02/06/24 14:36ID:???思うんだけど、どの環境でも使えるようにするにはrenameで統一、じゃなくて
BEGIN内で
BEGIN
{
if( find_out_if_flock_is_available() ) {
*_do_lock = \&_lock_flock;
} elsif( use_other_locking_mechanism() ) {
*_do_lock = \&_some_other_locking;
} else {
*_do_lock = \&_lock_rename;
}
}
みたいにしたらどうだろう(それじゃなきゃロックする関数内で何か
定数ををスイッチにしても同じだけど)。なんかrenameのロックとかって
イマイチ信用できんから、flock()が使えるならそれを使ったほうがよく
ない?
0034nobodyさん
02/06/24 19:25ID:kznFdEhQ0035nobodyさん
02/06/24 19:27ID:???$lock = fopen('lock.txt', 'w') or exit;
flock($lock, LOCK_EX);
〜処理〜
fclose($lock);
でいいんでないかな。
0037nobodyさん
02/06/24 22:01ID:???タイムアウト処理ってどうやってる?
どの環境でも有効なタイムアウト処理となると思いつかんけどみんなは書いてる?
0038nobodyさん
02/06/24 22:13ID:v5EexGczflock()は途中で死ぬとタイムアウトしないみたい(永遠にロック?)なんだけど、どうするべ?
0039nobodyさん
02/06/24 22:21ID:???0041nobodyさん
02/06/24 22:25ID:???設定しておくしかないんじゃないの
004238
02/06/24 22:29ID:???http://homepage1.nifty.com/glass/tom_neko/web/web_04.html
こんなことしてます。
eval {
local $SIG{ALRM} = sub { die "time out" }; # 時間が来たら抜け出す
open(OUT, "+< $datafile") or die;
alarm(5); # 先行プロセスを待つ時間(5秒)
flock(OUT, 2) or die; # ロック確認。ロック
alarm(60); # 自分自身の制限時間(1分)
一連の処理
close(OUT); # closeすれば自動でロック解除
alarm(0); # 無事済んだのでリセット
};
if ($@ =~ /time out/) {
タイムアウト時の処理
}
elsif ($@) { die }
0043j064157.ppp.asahi-net.or.jp
02/06/24 22:29ID:???0044nobodyさん
02/06/24 22:34ID:???まあ明日調べてみよう。
0046nobodyさん
02/06/25 13:13ID:???「古いロックファイル(ディレクトリ)の削除」の項で、作成時間が10分以上
前であることを確認したあとにリネームするのって複数プロセスでかち合う典型
だろ? このサイトの人ってそこんとこ理解しないで画期的とか書いてるYO!
http://homepage1.nifty.com/glass/tom_neko/web/web_04.html#deletelock
if ((-M $lockdir) * 86400 > 600) { # 作成時間が10分以上前なら
rename($lockdir2, $lockdir); # ロック入れ替え
last; # 一連の処理へ
}
0047nobodyさん
02/06/25 13:45ID:???0049nobodyさん
02/06/25 15:02ID:???プロセスが変な状態で生きてる時ぐらいじゃないのかな。
プロセスが完全に死んだら解放されると思うけど。
ま、暴走ってなんだって言われても困るが。
0050nobodyさん
02/06/25 16:28ID:+Rl2IvER0051fusianasan
02/06/25 16:36ID:???ファイル追加書き込みを10000ループぐらい連続でやるスクリプトを
同時に複数プロセスから実行させて、書き込まれた行数で判断すれば?
0052nobodyさん
02/06/25 17:04ID:???0053nobodyさん
02/06/25 18:20ID:???0054nobodyさん
02/06/25 18:21ID:???0055nobodyさん
02/06/25 21:07ID:???0056nobodyさん
02/06/25 21:15ID:???/ ヽ\
/ ヽ \ / \
/ ヽ \__ / ヽ \
/ ‐_ ヽ ―――__/ ヽ \
/  ̄ / __ ヽ \
|  ̄ \
| |
| || |
| ゝ_ |||/ |
| ( ・ ブ ゝ__ ┃ ┃ |
|  ̄ ( ・ ̄ ̄ ブ ┛ ┗ |
| ゝ__ ノ ━┓ ┏ | ┃ ┃
| __  ̄ ┃ | ┃ ┃
| | ̄ ̄ーヽ | ┃ ┃
| | ヽ |
| | |ヽ | ━┓
\ _⊥_ | | ┃┛
\  ̄ ̄ヽ_⊥ | ┏━┓
\ | ┏┛
\ / ・
0057nobodyさん
02/06/25 22:30ID:???0058nobodyさん
02/06/26 06:14ID:???0059nobodyさん
02/06/26 11:58ID:???/ ヽ\
/ ヽ \ / \
/ ヽ \__ / ヽ \
/ ‐_ ヽ ―――__/ ヽ \
/  ̄ / __ ヽ \
|  ̄ \
| |
| || |
| ゝ_ |||/ |
| ( ・ ブ ゝ__ ┃ ┃ |
|  ̄ ( ・ ̄ ̄ ブ ┛ ┗ |
| ゝ__ ノ ━┓ ┏ | ┃ ┃
| __  ̄ ┃ | ┃ ┃
| | ̄ ̄ーヽ | ┃ ┃
| | ヽ |
| | |ヽ | ━┓
\ _⊥_ | | ┃┛
\  ̄ ̄ヽ_⊥ | ┏━┓
\ | ┏┛
\ / ・
0060「このサイトの人」
02/06/26 17:34ID:uIGx/rWA>作成時間が10分以上
>前であることを確認したあとにリネームするのって複数プロセスでかち合う典型
>だろ?
コードをちゃんと読んでもらえれば分かりますが、ロックファイルを消すときの
排他のために、もうひとつ違うロックファイルを作ってます。ということで冗談
のような方法なので「画期的」とふざけてみたわけで。第2のロックファイルが
残っても消せないのが欠点。
残ったロックファイルを消す方法で、いまのところ完璧だと思うのは、
http://www.din.or.jp/~ohzaki/perl.htm#File_Lock
のrename式じゃないかな。
0061nobodyさん
02/06/26 17:45ID:???__,,:::=========:::,,_,__
...‐''゙ . ` ,_ ` ''‐...
..‐´ ゙ `‐..
─┼─ /\ / ○ \
─┼─ /\/_.........;;;;;;;;;;;;;;;;::´ (⌒,) .l ヽ.:;;;;;;;;;;;;;;;;;;;;;;................. |||
│ / ゙゙ .'  ̄ ヽ __ , ─| ヽ ゙゙゙゙゙゙゙゙゙゙゙゙゙;;;;;;;;;;......。・ ・ ・
| / / ヽ .| ゙: ゙゙゙゙゙;;;;;;
゙゙゙゙゙;;;;;;;;............ ;゙ ヽ l ゙; .............;;;;;;;;゙゙゙゙゙
゙゙゙゙゙゙゙゙゙;;;;;;;;;;;;;;;;;.......;............................. .ヽ ./ ..................................;.......;;;;;;;;;;;;;;;;;゙゙゙゙゙゙゙゙゙ ____
::::日F|xxx・,`:::::::::::::::::: ゙゙゙゙タ.゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ヽ ./゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙!!゙゙゙゙゙ ::::::::::::::::::`'*[] H]. |[][]|:
::::日日II[][]'l*:::::::::::::::::: ノキli; i . .;, 、 .,, .V ` ; 、 .; ´ ;,i!!|iγ :::::::::::::::::::j;‘日/ .|[][]|::::
::::口旦 E=Д;‘`::::::::::::::::::::: /゙||lii|li||,;,.il|i;, ; . ., ,li ' ; .` .; il,.;;.:||i .i| :;il|!!|;(゙ ::::::::::::::::::::::"‘、Дロ::::
::::Д日T† ;j;::::::::::::::::::::::: `;;i|l|li||lll|||il;i:ii,..,.i||l´i,,.;,.. .il `, ,i|;.,l;;:`ii||iil||il||il||l||i|lii゙ゝ :::::::::::::::::::::::・;日日T::: 日::::
::::Hvv´+"::::::::::::::::::::::::: ゙゙´`´゙-;il||||il|||li||i||iiii;ilii;lili;||i;;;,,|i;,:,i|liil||ill|||ilill|||ii||lli゙/`゙ :::::::::::::::::::::::::´.'田#v[][]†~~†::::
::::v[]>:・':::::::::::::::::::::::::: ゙`゙⌒ゞ;iill|||lli|llii:;゙|lii|||||l||ilil||i|llii;|;_゙ι´゚゙´`゙ ::::::::::::::::::::::::::+`:F|ロxxx::::
::::田#YYv、*;::::::::::::::::::::::::::::::::::::::: ´゙゙´`゙``´゙`゙´``´゙`゙゙´´ ::::::::::::::::::::::::::::::::::::::::,,・、::日旦::::
::::ロ|=|E」vxxx:`l::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;:`+E| ∩v |=|::::
0063fusianasan
02/06/26 19:33ID:???全然わかってないねー。まだ気づかないの?
0064「このサイトの人」
02/06/26 19:46ID:uIGx/rWAどの程度可能性があるのか分かりませんが、システムコール等が滞って、
プロセスが終了しなくなった状況を想定してみました。単に混んで遅く
なってる時に強制終了したらまずいですね。制限時間が1分は短かいかも。
要は、ロックファイルが残った時のように特別な場合です。そういう
方法もあるって事で紹介しましたが、実用性はあまり無いかもしれません。
0065「このサイトの人」
02/06/26 19:57ID:uIGx/rWAたしかに、わたしが全然分かってないのかもしれませんが。
下記のどこに問題がありますか?
$retry = 5; # リトライ回数セット
while (!mkdir($lockdir, 0755)) { # 作成。出来なければ待つ
if (--$retry <= 0) { # 5回ダメなら
if (mkdir($lockdir2, 0755)) { # ロックを消すための排他
if ((-M $lockdir) * 86400 > 600) { # 作成時間が10分以上前なら
rename($lockdir2, $lockdir); # ロック入れ替え
last; # 一連の処理へ
}
else { rmdir($lockdir2); } # 部分ロック削除
}
&error("BUSY"); # あきらめる
}
sleep(1); # 1秒待つ
}
1.作成時間が10分以上前なら
この隙間には他のプロセスが入れないよう2つ目のロックファイルで排他してある。
2.ロック入れ替え
0066fusianasan
02/06/26 20:08ID:???リネームに成功したかどうか、結果を確認できていない。
もしAというプロセスが10分以上前と判断した状態でプロセスを次に渡して、
Bというプロセスがリネームまで成功してCというプロセスが$lockdir2を作って
しまったら、Aというプロセスもリネームできてしまいロックできないのでは?
0067「このサイトの人」
02/06/26 22:17ID:uIGx/rWAなるほど。rename失敗までは考えていませんでした。
となると、プロセスAが$lockdir2を作り、かつrename失敗すると、
古い$lockdirと $lockdir2と両方が残りますね。デッドロックには
なりますが、次のプロセスは入って来れないんじゃないでしょうか?
「$lockdir2を消す」「$lockdirの作成時間を変える」をrenameで
いっぺんに行ってますが、$lockdir2 が消え$lockdirが更新されな
い、というrename失敗はあり得ますか?
あるいは、rename失敗時にはアトミックではなくなるとか?
0068fusianasan
02/06/26 22:39ID:???わかった?
プロセスA:作成時間が10分以上前と判断して処理を次へ渡す
プロセスB:作成時間が10分以上前と判断してリネームまで成功
プロセスC:$lockdir2を作成後、作成時間が10分以上前ではないからはじかれる
プロセスA:$lockdir2が存在するからリネーム成功
0069fusianasan
02/06/26 22:47ID:???勿論、作成時間が10分以上前ではない場合に削除する処理になってはいるが
これもまた削除する前に処理を次へ渡してしまう可能性もあることを念の為に。
0070nobodyさん
02/06/26 22:59ID:???/ ヽ\
/ ヽ \ / \
/ ヽ \__ / ヽ \
/ ‐_ ヽ ―――__/ ヽ \
/  ̄ / __ ヽ \
|  ̄ \
| |
| || |
| ゝ_ |||/ |
| ( ・ ブ ゝ__ ┃ ┃ |
|  ̄ ( ・ ̄ ̄ ブ ┛ ┗ |
| ゝ__ ノ ━┓ ┏ | ┃ ┃
| __  ̄ ┃ | ┃ ┃
| | ̄ ̄ーヽ | ┃ ┃
| | ヽ |
| | |ヽ | ━┓
\ _⊥_ | | ┃┛
\  ̄ ̄ヽ_⊥ | ┏━┓
\ | ┏┛
\ / ・
0071「このサイトの人」
02/06/26 23:51ID:uIGx/rWAあれ?
>プロセスA:作成時間が10分以上前と判断して処理を次へ渡す
と
>プロセスA:$lockdir2が存在するからリネーム成功
の間には他のプロセスは割り込めませんよ。
リネームを試みる前には$lockdir2がプロセスB等他を弾きます。
プロセスAがリネームを試みるのは一度だけ。
●作成時間が10分以上前の場合
プロセスA:ロックディレクトリ1に阻まれる(排他される)
プロセスA:ロックディレクトリ2を作成(排他)
プロセスA:作成時間が10分以上前と判断
プロセスA:$lockdir2が存在するからリネーム(ロックディレクトリ2をロックディレクトリ1に変換)(排他終了)
→プロセスBが割り込めるとしたらここだけ。しかもリネームが失敗した場合。
プロセスA:そのままロックに守られ排他が必要な処理
プロセスA:ロックディレクトリ1を消す
で、$lockdir2 が消え$lockdirが更新されない、というrename失敗
(こんなのあるの?)の場合だけプロセスBが割り込めます。
●作成時間が10分以上前ではない場合
プロセスA:ロックディレクトリ1に阻まれる(排他される)
プロセスA:ロックディレクトリ2を作成(排他)
プロセスA:作成時間が10分以上前でないと判断
プロセスA:ロックディレクトリ2を削除(排他終了)
プロセスA:&error("BUSY")でプロセス終了
0072nobodyさん
02/06/27 12:25ID:???/ ヽ\
/ ヽ \ / \
/ ヽ \__ / ヽ \
/ ‐_ ヽ ―――__/ ヽ \
/  ̄ / __ ヽ \
|  ̄ \
| |
| || |
| ゝ_ |||/ |
| ( ・ ブ ゝ__ ┃ ┃ |
|  ̄ ( ・ ̄ ̄ ブ ┛ ┗ |
| ゝ__ ノ ━┓ ┏ | ┃ ┃
| __  ̄ ┃ | ┃ ┃
| | ̄ ̄ーヽ | ┃ ┃
| | ヽ |
| | |ヽ | ━┓
\ _⊥_ | | ┃┛
\  ̄ ̄ヽ_⊥ | ┏━┓
\ | ┏┛
\ / ・
0073nobodyさん
02/06/27 12:36ID:???/ ヽ\
/ ヽ \ / \
/ ヽ \__ / ヽ \
/ ‐_ ヽ ―――__/ ヽ \
/  ̄ / __ ヽ \
|  ̄ \
| |
| || |
| ゝ_ |||/ |
| ( ・ ブ ゝ__ ┃ ┃ |
|  ̄ ( ・ ̄ ̄ ブ ┛ ┗ |
| ゝ__ ノ ━┓ ┏ | ┃ ┃
| __  ̄ ┃ | ┃ ┃
| | ̄ ̄ーヽ | ┃ ┃
| | ヽ |
| | |ヽ | ━┓
\ _⊥_ | | ┃┛
\  ̄ ̄ヽ_⊥ | ┏━┓
\ | ┏┛
0074nobodyさん
02/06/27 14:32ID:???/ ヽ\
/ ヽ \ / \
/ ヽ \__ / ヽ \
/ ‐_ ヽ ―――__/ ヽ \
/  ̄ / __ ヽ \
|  ̄ \
| |
| || |
| ゝ_ |||/ |
| ( ・ ブ ゝ__ ┃ ┃ |
|  ̄ ( ・ ̄ ̄ ブ ┛ ┗ |
| ゝ__ ノ ━┓ ┏ | ┃ ┃
| __  ̄ ┃ | ┃ ┃
| | ̄ ̄ーヽ | ┃ ┃
| | ヽ |
| | |ヽ | ━┓
\ _⊥_ | | ┃┛
\  ̄ ̄ヽ_⊥ | ┏━┓
\ | ┏┛
\ / ・
0075nobodyさん
02/06/27 17:02ID:???0076nobodyさん
02/06/27 17:20ID:???/ ヽ\
/ ヽ \ / \
/ ヽ \__ / ヽ \
/ ‐_ ヽ ―――__/ ヽ \
/  ̄ / __ ヽ \
|  ̄ \
| |
| || |
| ゝ_ |||/ |
| ( ・ ブ ゝ__ ┃ ┃ |
|  ̄ ( ・ ̄ ̄ ブ ┛ ┗ |
| ゝ__ ノ ━┓ ┏ | ┃ ┃
| __  ̄ ┃ | ┃ ┃
| | ̄ ̄ーヽ | ┃ ┃
| | ヽ |
| | |ヽ | ━┓
\ _⊥_ | | ┃┛
\  ̄ ̄ヽ_⊥ | ┏━┓
\ | ┏┛
\ / ・
0077nobodyさん
02/06/27 20:25ID:???\∧_ヘ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
,,、,、,,, / \〇ノゝ∩ < 1000取り合戦、いくぞゴルァ!! ,,、,、,,,
/三√ ゚Д゚) / \____________ ,,、,、,,,
/三/| ゚U゚|\ ,,、,、,,, ,,、,、,,,
,,、,、,,, U (:::::::::::) ,,、,、,,, \オーーーーーーーッ!!/
//三/|三|\ ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
∪ ∪ ( ) ( ) ( ) )
,,、,、,,, ,,、,、,,, ∧_∧∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
,,、,、,,, ( ) ( ) ( ) ( )
0078「このサイトの人」
02/06/28 01:42ID:lpc8XUFVとりあえず結論出しておきます。
rename失敗の殆どの場合、何も起こらなかった、つまり古いロック
1とロック2 が両方残ることになるでしょうから、その時には他のプ
ロセスが侵入することはありません。
万一、ロック2が消え古いロック1が残ると排他は失敗しますが、そ
の場合、ロック2のディレクトリが消失したか、違う名前にrenameさ
れたことになりますね。ファイルシステムのエラーによって、絶対
起こらない事とは言えませんが、そこまで考慮する必要があるのか
どうかは疑問。
疑問ではありますが、あえて考慮するなら、上記のわたしの排他制
御で、
rename($lockdir2, $lockdir) or &error("LOCK ERROR");
として、rename失敗したプロセスを、その時点で終了させることに
すれば問題なくなります。
ごく稀にロック2が残る可能性は残りますが、ロック1が残る可能性
より低いのですから、残存ロック削除機能付きの排他方法として、
それなりに使えるのではないかと。
では。
0080nobodyさん
02/06/29 07:01ID:???∧∧
|\ <ヽ`∀´> /|
ヾ  ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ /
 ̄ ̄ ̄ ̄ ̄ ̄| | ̄ ̄ ̄ ̄ ̄ ̄ ̄
| |
/ ̄ ̄ ̄ ̄\/ ̄ ̄ ̄ ̄ ̄\
__/ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ .\__ ドドン!!
___<__)__________ (__>___
0081nobodyさん
02/06/29 07:19ID:???改行しないヤシまでいるし。
0082nobodyさん
02/06/29 17:52ID:6eV+0rAgOSってどれくらいあるのよ? まさかWindows9xをWebサーバ
にするって話なの?
0083&r
02/06/29 17:56ID:???UNIX系にも一部あるそうですが…。
0084nobodyさん
02/06/29 18:19ID:/fhUzoY0サーバって、flockが効かなかったりするわけ。
0085nobodyさん
02/06/29 21:11ID:Nqaw2LrM0086nobodyさん
02/06/30 00:13ID:naYSzTIEhttp://www.rim.or.jp/support/guide/homepage/cgi/index2.html
0087nobodyさん
02/06/30 00:20ID:???どうしても移植性を持たせたいならconfigure/Makefile.PLでもつければ良い。
0088nobodyさん
02/06/30 04:05ID:???多い印象がありますが。
0089nobodyさん
02/06/30 04:45ID:???素人が設置する事の多いアクセスカウンターや掲示板やチャットなら、
flockが使えるかどうかなんて気にせずに、どこでも使えるロックファイル式
にしたいな。
0090nobodyさん
02/06/30 05:37ID:???1 symlink
2 mkdir
3 flock
4 rename
0091nobodyさん
02/06/30 07:57ID:YjReV7q7選択肢を増やしても、素人さんがつかうときに迷うだけじゃないの?
選ぶ基準はなに?
0092nobodyさん
02/06/30 10:18ID:???本当にそんな強固なファイルロックが必要なのかと…
そんだけアクセスあるんかいと…
ログが壊れてもそこそこのバックアップで復旧できるレベルの
CGIじゃないんかと…
0093nobodyさん
02/06/30 11:01ID:???0094nobodyさん
02/06/30 16:11ID:???flockが必ずエラーになるとか全く機能しないなら簡単だけど、
以前の@niftyでは、flockが「突然」壊れるって症状だったので、
自動判別は難しいかも。flockしたサーバと違うサーバで動く
プロセスがだめなのかな?
NFSなのかラウンドロビンなのかその他の複数サーバシステムなのか、
CGI側で判別できましたっけ。
@niftyは最近サーバがZeusに変わって、今の所flock使えてますが。
0095nobodyさん
02/06/30 16:49ID:???ここはわざわざスレッド建てないとファイルロックが解らない馬鹿共の集うスレ
0096nobodyさん
02/06/30 18:12ID:???単にファイル読みこむだけならロックしなくても大丈夫ですよね?
0097nobodyさん
02/06/30 18:33ID:???つーかflockもsymlinkも使えない鯖なんてそう無い
Windows鯖使ってるところなんて・・
0098nobodyさん
02/06/30 19:16ID:???だ か ら 、 あ る ん だ っ て ば 。
symlinkは大抵つかえると思うけど。
>>93
それってルーチンに組み込むってこと?そりゃマズーじゃない?(毎回余計な処理が増える)
チェック用CGIを添付しといて先にチェックしてもらうのいいかも。
汎用性考えるとmkdirをデフォルトにしとくのがいいと思う。mkdirできない鯖ってない・・でしょ?
0102nobodyさん
02/06/30 21:12ID:???0103japh ◆J.5V8ta6
02/06/30 21:29ID:???別のプロセスが書き込んでる最中に読むと、
壊れたデータを読む羽目になることがある
それを防ぐのが共用ロック:
use Fcntl qw(:flock);
open IN, "foofile" or die "ファイルが開けませんな($1)";
flock IN, LOCK_SH | LOCK_NB or die "誰かが書き込んでいる最中ですな($1)";
0106nobodyさん
02/06/30 23:00ID:???0107nobodyさん
02/07/01 01:23ID:???open(ONE, "> one.lock");
flock(ONE, 3);
open(TWO, "> two.lock");
flock(TWO, 2);
print TWO "two";
close(TWO);
print ONE "one";
close(ONE);
↑こんな感じに
■ このスレッドは過去ログ倉庫に格納されています