1 名前:nobodyさん [02/06/23 10:18 ID:eY2l+Gw1] どんな環境でも使えて、軽くて、頑丈なロックを考えようじゃありません
2 名前:2 mailto:sage [02/06/23 10:27 ID:???] ずさー
3 名前:nobodyさん mailto:sage [02/06/23 10:38 ID:???] >>1 は無能。学習意欲無し / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ ∧_∧ | 君さぁ こんなスレッド立てるから | ( ´∀`)< 厨房って言われちゃうんだよ | ( ∧∧ つ >―――――――――――――――――――‐< ( ゚Д゚) < おまえのことを必要としてる奴なんて | /つつ | いないんだからさっさと回線切って首吊れ | \____________________/ (-_-) ハヤクシンデネ… (∩∩)
4 名前:nobodyさん mailto:sage [02/06/23 10:45 ID:???] いまさらねえ… 検索エンジンで調べればわらわら出てくるんですけど。
5 名前:nobodyさん [02/06/23 11:15 ID:eY2l+Gw1] ワラワラでてくるのよりいいのを考えようって言ってんだよ
6 名前:nobodyさん mailto:sage [02/06/23 11:36 ID:???] >>5 まずそのワラワラ出てくるやつを、利点、欠点と共に列挙してから始めようか かぶると鬱だしな
7 名前:nobodyさん [02/06/23 11:39 ID:eY2l+Gw1] flock(対象ファイルを直接ロック) ファイルロック関数flockを使用して対象のファイルを直接ロックする。 特徴 ・速い。 ・アンロックし忘れが無い。 ・ファイル毎のロックに便利。 ・処理全体をロックする場合には不向き。 ・flockが使えない環境もある。 flock(ロック用ファイルをロック) ファイルロック関数flockを使用して別途用意したロック用ファイルをロックする。 特徴 ・速い。 ・アンロックし忘れが無い。 ・処理全体をロックする場合に便利。 ・ロック用ファイルが常に残る。 ・サーバーによってflockが使えない場合がある。 symlink シンボリックリンク関数symlinkを使用してロック用のシンボリックリンクを作成し、 シンボリックリンクの有無によりロック状態を判断する。 特徴 ・遅い。 ・ロックしたままの状態(ロック用シンボリックリンク)が残る可能性がある。 ・処理全体をロックする場合に便利。 ・サーバーによってsymlinkが使えない場合がある。 mkdir ディレクトリ作成関数mkdirを使用してロック用のディレクトリを作成し、 ディレクトリの有無によりロック状態を判断する。 特徴 ・遅い。 ・ロックしたままの状態(ロック用ディレクトリ)が残る可能性がある。 ・処理全体をロックする場合に便利。 ・どの環境でも使用できる。
8 名前:nobodyさん [02/06/23 11:40 ID:eY2l+Gw1] ↑ www1.plala.or.jp/bagi/labo/lock.html
9 名前:nobodyさん mailto:sage [02/06/23 11:47 ID:???]
10 名前:nobodyさん mailto:sage [02/06/23 11:48 ID:???] flock(対象ファイルを直接ロック) ファイルロック関数flockを使用して対象のファイルを直接ロックする。 特徴 ・速い。 ・アンロックし忘れが無い。 ・ファイル毎のロックに便利。 ・処理全体をロックする場合には不向き。 ・flockが使えない環境もある。 flock(ロック用ファイルをロック) ファイルロック関数flockを使用して別途用意したロック用ファイルをロックする。 特徴 ・速い。 ・アンロックし忘れが無い。 ・処理全体をロックする場合に便利。 ・ロック用ファイルが常に残る。 ・サーバーによってflockが使えない場合がある。 symlink シンボリックリンク関数symlinkを使用してロック用のシンボリックリンクを作成し、 シンボリックリンクの有無によりロック状態を判断する。 特徴 ・遅い。 ・ロックしたままの状態(ロック用シンボリックリンク)が残る可能性がある。 ・処理全体をロックする場合に便利。 ・サーバーによってsymlinkが使えない場合がある。 mkdir ディレクトリ作成関数mkdirを使用してロック用のディレクトリを作成し、 ディレクトリの有無によりロック状態を判断する。 特徴 ・遅い。 ・ロックしたままの状態(ロック用ディレクトリ)が残る可能性がある。 ・処理全体をロックする場合に便利。 ・どの環境でも使用できる。 flock(対象ファイルを直接ロック) ファイルロック関数flockを使用して対象のファイルを直接ロックする。 特徴 ・速い。 ・アンロックし忘れが無い。
11 名前:nobodyさん mailto:sage [02/06/23 11:48 ID:???] 要は複数のプロセスから共有できる資源があればいい。
12 名前:nobodyさん mailto:a [02/06/23 11:48 ID:???] tohoho.wakusei.ne.jp/lng/199903/99030145.htm とほほ 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使えるんなら素直に使っとけ。
13 名前:nobodyさん mailto:sage [02/06/23 12:31 ID:???] なんで、お前らこんな単発スレにレスしてるんだ?コーディングスレあるだろ
14 名前:nobodyさん mailto:sage [02/06/23 12:44 ID:???] >>13 そんな事言ってるあなたも なんで単発スレにレスしてるんだ?コーディングスレあるだろ
15 名前:nobodyさん mailto:sage [02/06/23 13:10 ID:???] >14 またまたぁ、そんなこといっちゃってー。 きみだって単発スレにレスしてるじゃん?コーディングスレあるだろ
16 名前:nobodyさん mailto:sage [02/06/23 13:34 ID:???] >15 そんなあなたも単発スレにレスしてるんじゃないの?コーディングスレあるだろ
17 名前:nobodyさん mailto:sage [02/06/23 13:59 ID:???] >>12 www.jp.qmail.org/q103/jman5/maildir.html > NFSの実装によっては信頼できるロックをまったく持っていません。 なんてのもあるし、lockdが刺さったらしいという経験もあるんで、どうしてもflockは避けちまう。
18 名前:nobodyさん mailto:sage [02/06/23 15:11 ID:???] >>17 そんなあなたも単発スレにレスしてるんじゃないの?コーディングスレあるだろ
19 名前:nobodyさん [02/06/23 17:37 ID:eY2l+Gw1] tohoho.wakusei.ne.jp/soft/wlng.htm コレのロックっていいんですか?
20 名前:nobodyさん mailto:sage [02/06/23 17:42 ID:???] >>19 またまたぁ、そんなこといっちゃってー。 きみだって単発スレにレスしてるじゃん?コーディングスレあるだろ
21 名前:nobodyさん mailto:sage [02/06/23 17:44 ID:???] ここが単発スレにレスしてるバカどもがいるスレですか?
22 名前:nobodyさん mailto:sage [02/06/23 19:15 ID:???] 単発質問スレもウザいが、自治厨もウザい
23 名前:nobodyさん mailto:sage [02/06/23 19:51 ID:???] ・単発質問スレ=無条件でゴミ ・単発スレ=スレが伸びればよし、伸びなければ自然消滅 区別しろよ。。。
24 名前: mailto:age [02/06/23 21:26 ID:???] ロック用にファイルを1つ作っておいて、 ロック時に rename ってのはダメ? if( rename( 元ファイル名, ロック中ファイル名 )){ 処理・・・・ } みたいなのは
25 名前:nobodyさん mailto:sage [02/06/23 21:52 ID:???] >>24 ありだけど、mkdirやsymlinkと変わらん プロセス死んだときの問題もね
26 名前:24 mailto:sage [02/06/23 22:26 ID:???] >>25 ありがとう。mkdirやsymlinkはよく見かけるけど、renameってのは みないから、おれが根本的になにか勘違いしてるのかと思ってました。
27 名前:nobodyさん mailto:sage [02/06/23 22:49 ID:???] >>24 またまたぁ、そんなこといっちゃってー。 きみだって単発スレにレスしてるじゃん?コーディングスレあるだろ
28 名前:nobodyさん mailto:sage [02/06/24 01:46 ID:???] >>24 =26 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だって普通にそこらへんにあるよ?
29 名前:nobodyさん mailto:sage [02/06/24 03:24 ID:???] >>248 またまたぁ、そんなこといっちゃってー。 きみだって単発スレにレスしてるじゃん?コーディングスレあるだろ
30 名前:nobodyさん mailto:sage [02/06/24 07:20 ID:???] www.google.co.jp/search?hl=ja&ie=UTF-8&oe=UTF8&q=%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%AD%E3%83%83%E3%82%AF&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
31 名前:nobodyさん mailto:sage [02/06/24 11:29 ID:???] >>30 またまたぁ、そんなこといっちゃってー。 きみだって単発スレにレスしてるじゃん?コーディングスレあるだろ
32 名前:nobodyさん mailto:sage [02/06/24 13:52 ID:???] Perlメモのロック処理をクラスで包んでみた。 特徴 ・むちゃくちゃ遅い ・アンロックし忘れがない ・処理全体をロックする場合に便利 ・どの環境でも使用できる #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__
33 名前:nobodyさん mailto:sage [02/06/24 14:36 ID:???] >>32 思うんだけど、どの環境でも使えるようにするには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()が使えるならそれを使ったほうがよく ない?
34 名前:nobodyさん [02/06/24 19:25 ID:kznFdEhQ] flockの方が糞
35 名前:nobodyさん mailto:? [02/06/24 19:27 ID:???] 処理全体をロックしたいばやいは $lock = fopen('lock.txt', 'w') or exit; flock($lock, LOCK_EX); 〜処理〜 fclose($lock); でいいんでないかな。
36 名前:nobodyさん mailto:sage [02/06/24 21:15 ID:???] >>35 PHPかなんかか?それ。
37 名前:nobodyさん mailto:sage [02/06/24 22:01 ID:???] ファイルロックなんて必要なほどアクセスないからどでもいいけど、 タイムアウト処理ってどうやってる? どの環境でも有効なタイムアウト処理となると思いつかんけどみんなは書いてる?
38 名前:nobodyさん [02/06/24 22:13 ID:v5EexGcz] KENTでいいや。 flock()は途中で死ぬとタイムアウトしないみたい(永遠にロック?)なんだけど、どうするべ?
39 名前:nobodyさん mailto:sage [02/06/24 22:21 ID:???] へ?flockはOSが後始末してくれると思ったけど
40 名前:nobodyさん mailto:sage [02/06/24 22:22 ID:???] >>38 俺もなんか以前(×人名)そんなことあったなー。 なんでだろ?
41 名前:nobodyさん mailto:sage [02/06/24 22:25 ID:???] まあもしflockが解放しないとしたら、シグナルハンドラでも 設定しておくしかないんじゃないの
42 名前:38 mailto:sage [02/06/24 22:29 ID:???] わたしが見たソース(古い) 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 }
43 名前:j064157.ppp.asahi-net.or.jp mailto:sage [02/06/24 22:29 ID:???] Windowsってさ、flock もできなけりゃぁ、タイムアウトもできないよね。
44 名前:nobodyさん mailto:sage [02/06/24 22:34 ID:???] ああ、これか。確かに見たことあるような。 まあ明日調べてみよう。
45 名前:nobodyさん mailto:sage [02/06/24 22:40 ID:???] >>43 NT系ならできるよぉ。
46 名前:nobodyさん mailto:age [02/06/25 13:13 ID:???] >42 「古いロックファイル(ディレクトリ)の削除」の項で、作成時間が10分以上 前であることを確認したあとにリネームするのって複数プロセスでかち合う典型 だろ? このサイトの人ってそこんとこ理解しないで画期的とか書いてるYO! homepage1.nifty.com/glass/tom_neko/web/web_04.html#deletelock if ((-M $lockdir) * 86400 > 600) { # 作成時間が10分以上前なら rename($lockdir2, $lockdir); # ロック入れ替え last; # 一連の処理へ }
47 名前:nobodyさん mailto:sage [02/06/25 13:45 ID:???] (゚Д゚)ハァ?
48 名前:nobodyさん mailto:sage [02/06/25 14:38 ID:???] >>45 NT系でalarm使える? うちのActivePerl626ではunimplementedだよ…。
49 名前:nobodyさん mailto:sage [02/06/25 15:02 ID:???] flockがロックを解放しないのって、スクリプトが暴走して プロセスが変な状態で生きてる時ぐらいじゃないのかな。 プロセスが完全に死んだら解放されると思うけど。 ま、暴走ってなんだって言われても困るが。
50 名前:nobodyさん [02/06/25 16:28 ID:+Rl2IvER] 自作ロックを検証する方法ってどういうのがいちばん適切?
51 名前:fusianasan mailto:age [02/06/25 16:36 ID:???] >50 ファイル追加書き込みを10000ループぐらい連続でやるスクリプトを 同時に複数プロセスから実行させて、書き込まれた行数で判断すれば?
52 名前:nobodyさん mailto:sage [02/06/25 17:04 ID:???] alerm使うよりLOCK_NB使えよ。
53 名前:nobodyさん mailto:sage [02/06/25 18:20 ID:???] alerm使うよりalarm使えよ
54 名前:nobodyさん mailto:sage [02/06/25 18:21 ID:???] (゚Д゚)ハァ?
55 名前:nobodyさん mailto:sage [02/06/25 21:07 ID:???] (OДO)ハァ!
56 名前:nobodyさん mailto:sage [02/06/25 21:15 ID:???] /\ / ヽ\ / ヽ \ / \ / ヽ \__ / ヽ \ / ‐_ ヽ ―――__/ ヽ \ /  ̄ / __ ヽ \ |  ̄ \ | | | || | | ゝ_ |||/ | | ( ・ ブ ゝ__ ┃ ┃ | |  ̄ ( ・ ̄ ̄ ブ ┛ ┗ | | ゝ__ ノ ━┓ ┏ | ┃ ┃ | __  ̄ ┃ | ┃ ┃ | | ̄ ̄ーヽ | ┃ ┃ | | ヽ | | | |ヽ | ━┓ \ _⊥_ | | ┃┛ \  ̄ ̄ヽ_⊥ | ┏━┓ \ | ┏┛ \ / ・
57 名前:nobodyさん mailto:sage [02/06/25 22:30 ID:???] スペルミスぐらい見逃してやれ
58 名前:nobodyさん mailto:sage [02/06/26 06:14 ID:???] 板全体が殺伐としていますね・・
59 名前:nobodyさん mailto:sage [02/06/26 11:58 ID:???] /\ / ヽ\ / ヽ \ / \ / ヽ \__ / ヽ \ / ‐_ ヽ ―――__/ ヽ \ /  ̄ / __ ヽ \ |  ̄ \ | | | || | | ゝ_ |||/ | | ( ・ ブ ゝ__ ┃ ┃ | |  ̄ ( ・ ̄ ̄ ブ ┛ ┗ | | ゝ__ ノ ━┓ ┏ | ┃ ┃ | __  ̄ ┃ | ┃ ┃ | | ̄ ̄ーヽ | ┃ ┃ | | ヽ | | | |ヽ | ━┓ \ _⊥_ | | ┃┛ \  ̄ ̄ヽ_⊥ | ┏━┓ \ | ┏┛ \ / ・
60 名前:「このサイトの人」 [02/06/26 17:34 ID:uIGx/rWA] >>46 >作成時間が10分以上 >前であることを確認したあとにリネームするのって複数プロセスでかち合う典型 >だろ? コードをちゃんと読んでもらえれば分かりますが、ロックファイルを消すときの 排他のために、もうひとつ違うロックファイルを作ってます。ということで冗談 のような方法なので「画期的」とふざけてみたわけで。第2のロックファイルが 残っても消せないのが欠点。 残ったロックファイルを消す方法で、いまのところ完璧だと思うのは、 www.din.or.jp/~ohzaki/perl.htm#File_Lock のrename式じゃないかな。
61 名前:nobodyさん mailto:sage [02/06/26 17:45 ID:???] __,,:::=========:::,,_,__ ...‐''゙ . ` ,_ ` ''‐... ..‐´ ゙ `‐.. ─┼─ /\ / ○ \ ─┼─ /\/_.........;;;;;;;;;;;;;;;;::´ (⌒,) .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 |=|::::
62 名前:nobodyさん mailto:sage [02/06/26 19:08 ID:???] >>60 flockがロックを解放しないというのは?
63 名前:fusianasan mailto:age [02/06/26 19:33 ID:???] >60 全然わかってないねー。まだ気づかないの?
64 名前:「このサイトの人」 [02/06/26 19:46 ID:uIGx/rWA] >>62 どの程度可能性があるのか分かりませんが、システムコール等が滞って、 プロセスが終了しなくなった状況を想定してみました。単に混んで遅く なってる時に強制終了したらまずいですね。制限時間が1分は短かいかも。 要は、ロックファイルが残った時のように特別な場合です。そういう 方法もあるって事で紹介しましたが、実用性はあまり無いかもしれません。
65 名前:「このサイトの人」 [02/06/26 19:57 ID:uIGx/rWA] >>63 たしかに、わたしが全然分かってないのかもしれませんが。 下記のどこに問題がありますか? $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.ロック入れ替え
66 名前:fusianasan mailto:age [02/06/26 20:08 ID:???] >65 リネームに成功したかどうか、結果を確認できていない。 もしAというプロセスが10分以上前と判断した状態でプロセスを次に渡して、 Bというプロセスがリネームまで成功してCというプロセスが$lockdir2を作って しまったら、Aというプロセスもリネームできてしまいロックできないのでは?
67 名前:「このサイトの人」 [02/06/26 22:17 ID:uIGx/rWA] >>66 なるほど。rename失敗までは考えていませんでした。 となると、プロセスAが$lockdir2を作り、かつrename失敗すると、 古い$lockdirと $lockdir2と両方が残りますね。デッドロックには なりますが、次のプロセスは入って来れないんじゃないでしょうか? 「$lockdir2を消す」「$lockdirの作成時間を変える」をrenameで いっぺんに行ってますが、$lockdir2 が消え$lockdirが更新されな い、というrename失敗はあり得ますか? あるいは、rename失敗時にはアトミックではなくなるとか?
68 名前:fusianasan mailto:age [02/06/26 22:39 ID:???] >67 わかった? プロセスA:作成時間が10分以上前と判断して処理を次へ渡す プロセスB:作成時間が10分以上前と判断してリネームまで成功 プロセスC:$lockdir2を作成後、作成時間が10分以上前ではないからはじかれる プロセスA:$lockdir2が存在するからリネーム成功
69 名前:fusianasan mailto:age [02/06/26 22:47 ID:???] 補足: 勿論、作成時間が10分以上前ではない場合に削除する処理になってはいるが これもまた削除する前に処理を次へ渡してしまう可能性もあることを念の為に。
70 名前:nobodyさん mailto:sage [02/06/26 22:59 ID:???] /\ / ヽ\ / ヽ \ / \ / ヽ \__ / ヽ \ / ‐_ ヽ ―――__/ ヽ \ /  ̄ / __ ヽ \ |  ̄ \ | | | || | | ゝ_ |||/ | | ( ・ ブ ゝ__ ┃ ┃ | |  ̄ ( ・ ̄ ̄ ブ ┛ ┗ | | ゝ__ ノ ━┓ ┏ | ┃ ┃ | __  ̄ ┃ | ┃ ┃ | | ̄ ̄ーヽ | ┃ ┃ | | ヽ | | | |ヽ | ━┓ \ _⊥_ | | ┃┛ \  ̄ ̄ヽ_⊥ | ┏━┓ \ | ┏┛ \ / ・
71 名前:「このサイトの人」 [02/06/26 23:51 ID:uIGx/rWA] >>68 あれ? >プロセス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")でプロセス終了
72 名前:nobodyさん mailto:sage [02/06/27 12:25 ID:???] /\ / ヽ\ / ヽ \ / \ / ヽ \__ / ヽ \ / ‐_ ヽ ―――__/ ヽ \ /  ̄ / __ ヽ \ |  ̄ \ | | | || | | ゝ_ |||/ | | ( ・ ブ ゝ__ ┃ ┃ | |  ̄ ( ・ ̄ ̄ ブ ┛ ┗ | | ゝ__ ノ ━┓ ┏ | ┃ ┃ | __  ̄ ┃ | ┃ ┃ | | ̄ ̄ーヽ | ┃ ┃ | | ヽ | | | |ヽ | ━┓ \ _⊥_ | | ┃┛ \  ̄ ̄ヽ_⊥ | ┏━┓ \ | ┏┛ \ / ・
73 名前:nobodyさん mailto:sage [02/06/27 12:36 ID:???] /\ / ヽ\ / ヽ \ / \ / ヽ \__ / ヽ \ / ‐_ ヽ ―――__/ ヽ \ /  ̄ / __ ヽ \ |  ̄ \ | | | || | | ゝ_ |||/ | | ( ・ ブ ゝ__ ┃ ┃ | |  ̄ ( ・ ̄ ̄ ブ ┛ ┗ | | ゝ__ ノ ━┓ ┏ | ┃ ┃ | __  ̄ ┃ | ┃ ┃ | | ̄ ̄ーヽ | ┃ ┃ | | ヽ | | | |ヽ | ━┓ \ _⊥_ | | ┃┛ \  ̄ ̄ヽ_⊥ | ┏━┓ \ | ┏┛
74 名前:nobodyさん mailto:sage [02/06/27 14:32 ID:???] /\ / ヽ\ / ヽ \ / \ / ヽ \__ / ヽ \ / ‐_ ヽ ―――__/ ヽ \ /  ̄ / __ ヽ \ |  ̄ \ | | | || | | ゝ_ |||/ | | ( ・ ブ ゝ__ ┃ ┃ | |  ̄ ( ・ ̄ ̄ ブ ┛ ┗ | | ゝ__ ノ ━┓ ┏ | ┃ ┃ | __  ̄ ┃ | ┃ ┃ | | ̄ ̄ーヽ | ┃ ┃ | | ヽ | | | |ヽ | ━┓ \ _⊥_ | | ┃┛ \  ̄ ̄ヽ_⊥ | ┏━┓ \ | ┏┛ \ / ・
75 名前:nobodyさん mailto:sage [02/06/27 17:02 ID:???] 透明あぼーん面倒
76 名前:nobodyさん mailto:sage [02/06/27 17:20 ID:???] /\ / ヽ\ / ヽ \ / \ / ヽ \__ / ヽ \ / ‐_ ヽ ―――__/ ヽ \ /  ̄ / __ ヽ \ |  ̄ \ | | | || | | ゝ_ |||/ | | ( ・ ブ ゝ__ ┃ ┃ | |  ̄ ( ・ ̄ ̄ ブ ┛ ┗ | | ゝ__ ノ ━┓ ┏ | ┃ ┃ | __  ̄ ┃ | ┃ ┃ | | ̄ ̄ーヽ | ┃ ┃ | | ヽ | | | |ヽ | ━┓ \ _⊥_ | | ┃┛ \  ̄ ̄ヽ_⊥ | ┏━┓ \ | ┏┛ \ / ・
77 名前:nobodyさん mailto:sage [02/06/27 20:25 ID:???] \∧_ヘ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ,,、,、,,, / \〇ノゝ∩ < 1000取り合戦、いくぞゴルァ!! ,,、,、,,, /三√ ゚Д゚) / \____________ ,,、,、,,, /三/| ゚U゚|\ ,,、,、,,, ,,、,、,,, ,,、,、,,, U (:::::::::::) ,,、,、,,, \オーーーーーーーッ!!/ //三/|三|\ ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧ ∪ ∪ ( ) ( ) ( ) ) ,,、,、,,, ,,、,、,,, ∧_∧∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧ ,,、,、,,, ( ) ( ) ( ) ( )
78 名前:「このサイトの人」 [02/06/28 01:42 ID:lpc8XUFV] おかげさまで、rename失敗の場合について考える機会を持てました。 とりあえず結論出しておきます。 rename失敗の殆どの場合、何も起こらなかった、つまり古いロック 1とロック2 が両方残ることになるでしょうから、その時には他のプ ロセスが侵入することはありません。 万一、ロック2が消え古いロック1が残ると排他は失敗しますが、そ の場合、ロック2のディレクトリが消失したか、違う名前にrenameさ れたことになりますね。ファイルシステムのエラーによって、絶対 起こらない事とは言えませんが、そこまで考慮する必要があるのか どうかは疑問。 疑問ではありますが、あえて考慮するなら、上記のわたしの排他制 御で、 rename($lockdir2, $lockdir) or &error("LOCK ERROR"); として、rename失敗したプロセスを、その時点で終了させることに すれば問題なくなります。 ごく稀にロック2が残る可能性は残りますが、ロック1が残る可能性 より低いのですから、残存ロック削除機能付きの排他方法として、 それなりに使えるのではないかと。 では。
79 名前:nobodyさん mailto:sage [02/06/28 09:45 ID:???] >>78 興味深い話題をありがとー
80 名前:nobodyさん mailto:age [02/06/29 07:01 ID:???] キ・ム・チッ! ∧∧ |\ <ヽ`∀´> /| ヾ  ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ /  ̄ ̄ ̄ ̄ ̄ ̄| | ̄ ̄ ̄ ̄ ̄ ̄ ̄ | | / ̄ ̄ ̄ ̄\/ ̄ ̄ ̄ ̄ ̄\ __/ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ .\__ ドドン!! ___<__)__________ (__>___
81 名前:nobodyさん mailto:sage [02/06/29 07:19 ID:???] ここの板の住人の文って句点が多いな。 改行しないヤシまでいるし。
82 名前:nobodyさん [02/06/29 17:52 ID:6eV+0rAg] 根本的なことだけど、ファイルロックをサポートしていない OSってどれくらいあるのよ? まさかWindows9xをWebサーバ にするって話なの?
83 名前:&r mailto:sage [02/06/29 17:56 ID:???] >82 UNIX系にも一部あるそうですが…。
84 名前:nobodyさん [02/06/29 18:19 ID:/fhUzoY0] NFSやらラウンドロビンやら使った大規模なサーバシステムのプロバイダの サーバって、flockが効かなかったりするわけ。
85 名前:nobodyさん [02/06/29 21:11 ID:Nqaw2LrM] OSというかプロバイダによってはflockがうまくいかないんでそ
86 名前:nobodyさん [02/06/30 00:13 ID:naYSzTIE] リムネットは使えませんね。 www.rim.or.jp/support/guide/homepage/cgi/index2.html
87 名前:nobodyさん mailto:sage [02/06/30 00:20 ID:???] Unix系ではflock()が使えない方が少数派なんだから素直にflock()すれば良い。 どうしても移植性を持たせたいならconfigure/Makefile.PLでもつければ良い。
88 名前:nobodyさん mailto:sage [02/06/30 04:05 ID:???] そこいらのプロバイダのWebスペースやレン鯖はflock使えないとこ 多い印象がありますが。
89 名前:nobodyさん mailto:sage [02/06/30 04:45 ID:???] 要は誰がどこで使うCGIかだよね。 素人が設置する事の多いアクセスカウンターや掲示板やチャットなら、 flockが使えるかどうかなんて気にせずに、どこでも使えるロックファイル式 にしたいな。
90 名前:nobodyさん mailto:sage [02/06/30 05:37 ID:???] 選択式にすればいいだけじゃん? 1 symlink 2 mkdir 3 flock 4 rename
91 名前:nobodyさん [02/06/30 07:57 ID:YjReV7q7] >>90 選択肢を増やしても、素人さんがつかうときに迷うだけじゃないの? 選ぶ基準はなに?
92 名前:nobodyさん mailto:sage [02/06/30 10:18 ID:???] えー、結局、そもそも素人が作る程度のCGIに 本当にそんな強固なファイルロックが必要なのかと… そんだけアクセスあるんかいと… ログが壊れてもそこそこのバックアップで復旧できるレベルの CGIじゃないんかと…
93 名前:nobodyさん mailto:sage [02/06/30 11:01 ID:???] CGIの中で、flockが使えるか自前で判断して切り替えるのは?
94 名前:nobodyさん mailto:sage [02/06/30 16:11 ID:???] >>93 flockが必ずエラーになるとか全く機能しないなら簡単だけど、 以前の@niftyでは、flockが「突然」壊れるって症状だったので、 自動判別は難しいかも。flockしたサーバと違うサーバで動く プロセスがだめなのかな? NFSなのかラウンドロビンなのかその他の複数サーバシステムなのか、 CGI側で判別できましたっけ。 @niftyは最近サーバがZeusに変わって、今の所flock使えてますが。
95 名前:nobodyさん mailto:sage [02/06/30 16:49 ID:???] ここはわざわざスレッド建てないとファイルロックが解らない馬鹿共の集うスレ
96 名前:nobodyさん mailto:age [02/06/30 18:12 ID:???] 単にファイル読みこむだけならロックしなくても大丈夫ですよね?
97 名前:nobodyさん mailto:age [02/06/30 18:33 ID:???] つーかflockもsymlinkも使えない鯖なんてそう無い Windows鯖使ってるところなんて・・
98 名前:nobodyさん mailto:sage [02/06/30 19:16 ID:???] >>97 だ か ら 、 あ る ん だ っ て ば 。 symlinkは大抵つかえると思うけど。 >>93 それってルーチンに組み込むってこと?そりゃマズーじゃない?(毎回余計な処理が増える) チェック用CGIを添付しといて先にチェックしてもらうのいいかも。 汎用性考えるとmkdirをデフォルトにしとくのがいいと思う。mkdirできない鯖ってない・・でしょ?
99 名前:japh ◆J.5V8ta6 mailto:sage [02/06/30 20:47 ID:???] >>96 誰も読み込まない確信があるならのなら大丈夫。
100 名前:nobodyさん mailto:age [02/06/30 20:48 ID:???] >>98 じゃあflockとsymlinkでいいじゃん
101 名前:nobodyさん mailto:age [02/06/30 20:58 ID:???] >>99 どういう意味?
102 名前:nobodyさん mailto:sage [02/06/30 21:12 ID:???] ネタニマジレス(・∀・)カコイイ!!!
103 名前:japh ◆J.5V8ta6 mailto:sage [02/06/30 21:29 ID:???] >>101 別のプロセスが書き込んでる最中に読むと、 壊れたデータを読む羽目になることがある それを防ぐのが共用ロック: use Fcntl qw(:flock); open IN, "foofile" or die "ファイルが開けませんな($1)"; flock IN, LOCK_SH | LOCK_NB or die "誰かが書き込んでいる最中ですな($1)";
104 名前:nobodyさん mailto:age [02/06/30 21:37 ID:???] >>103 書き込み処理だけロックしとけば大丈夫だよね?
105 名前:nobodyさん mailto:sage [02/06/30 22:36 ID:???] >>104 たぶんダメ
106 名前:nobodyさん mailto:sage [02/06/30 23:00 ID:???] 最初から最期までロックしとけ
107 名前:nobodyさん mailto:sage [02/07/01 01:23 ID:???] flockって別のロックファイルで2つ同時に使うことできる? open(ONE, "> one.lock"); flock(ONE, 3); open(TWO, "> two.lock"); flock(TWO, 2); print TWO "two"; close(TWO); print ONE "one"; close(ONE); ↑こんな感じに
108 名前:nobodyさん mailto:sage [02/07/01 01:41 ID:???] >107 それでロックしてるの? もっと基本から確認してみては?
109 名前:nobodyさん mailto:sage [02/07/01 02:01 ID:???] >>107 ヴァカハケーン!!
110 名前:nobodyさん mailto:sage [02/07/01 02:23 ID:???] >>107 flockは一回でいいんだよ。 あとは検索してやり直せ。
111 名前:nobodyさん mailto:sage [02/07/01 02:27 ID:???] >110 おまえも気づけYO!
112 名前:nobodyさん mailto:sage [02/07/01 22:52 ID:???] 面白いの見っけ。 tako.2ch.net/test/read.cgi?bbs=perl&key=963036704&st=33
113 名前:nobodyさん [02/07/02 12:38 ID:3nOaRL0G] みれない
114 名前:nobodyさん mailto:sage [02/07/02 17:44 ID:???] こっちで natto.2ch.net/perl/kako/963/963036704.html
115 名前:nobodyさん mailto:sage [02/07/04 16:41 ID:???] 哲学者がスパゲティ食べているスレはここですか? ・・・と煽ろうと思ったら,レベルの低いスレだったのね.失礼.
116 名前:Hideki ◆wtRzKEV2 mailto:sage [02/07/09 09:11 ID:???] mkdirでやってみたんですが、以上終了してディレクトリーが残っていたら、 3秒で消し去るのって問題ありでしょうか? とほほとか見て作ってみたんですけど指摘があればお願いします。 (my $mode, my $file, @_) = @_; while(!mkdir("$file.lock", 0755)) { sleep(1); rmdir "$file.lock" if(time - (stat "$file.lock")[9] > 3); } open(DATA, "$mode$file"); print DATA @_; close DATA; return rmdir "$file.lock";
117 名前:Hideki ◆wtRzKEV2 mailto:age [02/07/09 09:12 ID:???] age
118 名前:nobodyさん [02/07/09 09:31 ID:zyHRUAZm] 21 名前: 投稿日:2002/06/03(月) 22:01 始めて裁判見てきたけど、ひろゆきって2chでの中傷について、「おいらは第三者だもんねー」ってな主張してたけど、裁判官に一喝されてた。 どうもひろゆきが企業の中傷を禁止してないことと、削除依頼を自分の意思で突っぱねたことで、当事者と判断されてる感じ。 でも裁判官も他の掲示板と2chは同じには扱っていないみたいだったから、他の掲示板には影響ないと思うけど。 それにしても、ひろゆきの顔はイベント板のタイトルに使ってる写真と全然違うのに驚いた。 あの写真は「勝負写真」なんだろうけど、あれじゃ詐欺だよ。 実物は深海魚みたいな顔だった。
119 名前:nobodyさん mailto:age [02/07/09 16:05 ID:???] >>116 はなしにならん。きみには失望させられたよ。
120 名前:Hideki ◆wtRzKEV2 [02/07/09 18:23 ID:upY+9e5f] 119>> 指摘して。
121 名前:nobodyさん mailto:age [02/07/09 18:54 ID:???] >>Hideki ◆wtRzKEV2 指摘する前に質問させてくれ。 これはソースの一部分か? どうみても独立したソースじゃないよな。 なぜファイルロックにmkdirが有効なのか理解できてるのか?
122 名前:Hideki ◆wtRzKEV2 [02/07/09 20:00 ID:upY+9e5f] >>121 ファイルを書き込むためのサブルーチンです。&writeFile('>', 'abc.txt', 'ABCDEF') みたいに渡す構成です。 mkdirを使えば -> OS処理なので2つのプロセスが両方とも実行ができない。(Windows, UNIXで使える) -> mkdir以下のコードはひとつのプロセスが実行する保証が得られる -> mkdirできない間(rmdirが実行されるまで)は他のプロセスは待つ -> mkdirできれば、ファイルを書きに行く。 -> もし異常終了か何かでロックディレクトリーが残っていれば3秒以上経った物は不正なロックとして強制削除。ファイルを書きに行く。 という構成で書いたのですが、どこら辺が話にならないのでしょうか?説明お願いします。
123 名前:nobodyさん mailto:age [02/07/09 20:14 ID:???] >>Hideki ◆wtRzKEV2 ファイルロックを実行して、目的のファイルデータを読み書きするのに要する 時間は処理の混み具合によっては3秒以上かかる可能性もある。もし3秒以上 処理にかかったら他のプロセスにデータを壊される可能性あり。 ファイルロック以外の部分でも書き込み途中でシステムがダウンしたらデータが 壊れる可能性もある。
124 名前:Hideki ◆wtRzKEV2 mailto:hideki@massassi.net [02/07/09 20:56 ID:???] > 時間は処理の混み具合によっては3秒以上かかる可能性もある 秒数で攻めたらいたちごっこですね。 壊す危険を冒すよりは、書き込みを中止する方がいいかもしれませんね。 > 途中でシステムがダウンしたら そりゃopen後書き込む前に刺さりゃー、何のロックしても無駄ってヤツだ。
125 名前:nobodyさん mailto:sage [02/07/09 22:36 ID:???] Hideki ◆wtRzKEV2 を叩くスレはここ?
126 名前:japh ◆J.5V8ta6 mailto:sage [02/07/09 23:02 ID:???] う〜む。>>116 のロックの考え方自体はそれほど悪いモノではないと思えるのだが。 暇な時に耐久テストでもしてみるか…。
127 名前:nobodyさん mailto:sage [02/07/09 23:05 ID:???] >>124 そう思うならそれで良い、どれだけデータの安全と整合性を保障したいかだから。 そう言う人が秒間50アクセスのDBを管理するなんて事も珍しいでしょうし。 取り合えず statの取得とrmdirがシステムコールレベルでアトミックになされる保障は 何処にも無い。 消そうとするロックディレクトリが正常かどうかの判断が出来ていない。 よって >rmdir "$file.lock" if(time - (stat "$file.lock")[9] > 3); この行は有っても無くても同じ
128 名前:nobodyさん mailto:sage [02/07/09 23:07 ID:???] 本気な人がまた・・・ 基本的に動作と確認が一発で出来る様な アトミックなシステムコールを使わなきゃ駄目です。 ifで調べてから、動作なんてその間一万年掛かるかも知れないし
129 名前:Hideki ◆wtRzKEV2 mailto:sage [02/07/10 00:11 ID:???] 説明どうもありがとうございました。出直してきます。
130 名前:nobodyさん mailto:sage [02/07/10 00:16 ID:???] なんだ、あっさり玉砕か。( ´_ゝ`)ププッ
131 名前:Hideki ◆wtRzKEV2 mailto:sage [02/07/10 00:22 ID:???] 正直毎秒50アクセスに耐えうるまでの別次元の設計は要らない。 同次元の突込みが無いので自分のためのスクリプトしては問題は無いと思った。 つーか、てめーはだれだ!ププッじゃねぇぞ、コルゥァ!
132 名前: mailto:age [02/07/10 00:34 ID:???] >>124 >> 途中でシステムがダウンしたら >そりゃopen後書き込む前に刺さりゃー、何のロックしても無駄ってヤツだ。 この考え方からしてまだまだだよな。元データを壊さない工夫がないって言い たかったのに…。
133 名前:Hideki ◆wtRzKEV2 mailto:hideki@massassi.net [02/07/10 00:35 ID:???] > まだまだだよな そうです。まだまだこれからです。まだ若いので。
134 名前: mailto:age [02/07/10 00:49 ID:???] >>133 おおー。まだいるんか。 も1つヒントというか助言だが、mkdir より symlink または rename が いいと思うぞ。なぜかと言うと mkdir より軽いからだ。なぜ軽いかというと ファイルシステムを勉強すればわかる。 ただし、symlink は環境によっては使えないから rename を使ったほうがい いということだ。 最後に、プロは完璧に近いものをストックとしていくつかもっているけど ここじゃ披露する気にはなれないということを言っておこう。
135 名前:nobodyさん mailto:sage [02/07/10 00:49 ID:???] なんだ、あっさり玉砕か。( ´_ゝ`)ププッ
136 名前:nobodyさん mailto:sage [02/07/10 00:49 ID:???] なんだ、あっさり玉砕か。( ´_ゝ`)ププッ
137 名前:nobodyさん mailto:sage [02/07/10 00:49 ID:???] なんだ、あっさり玉砕か。( ´_ゝ`)ププッ
138 名前:nobodyさん mailto:sage [02/07/10 00:50 ID:???] なんだ、あっさり玉砕か。( ´_ゝ`)ププッ
139 名前:nobodyさん mailto:sage [02/07/10 00:53 ID:???] 駄目駄目な実例。突っ込みどころ満載です。 www2q.biglobe.ne.jp/~terra/cgi/lockfile.htm
140 名前: mailto:age [02/07/10 00:57 ID:???] >>139 ユーモアのあるページだなぁ。この人は基本的な関数の実行結果の真偽を 使うことも知らないのか…。 こういうページが氾濫しては…。
141 名前:nobodyさん mailto:sage [02/07/10 02:06 ID:???] >>139 dat 落ち前に読んでおけ pc.2ch.net/test/read.cgi/sec/1025671013/349-
142 名前:nobodyさん mailto:sage [02/07/10 02:35 ID:???] ファイルなんて使わんと DBMS 使えばよろし
143 名前:nobodyさん mailto:age [02/07/10 02:59 ID:???] >>142 DBMSがファイル使ってないとでも思ってんのかage
144 名前:nobodyさん mailto:sage [02/07/10 03:04 ID:???] ここは面白いひとが多いなあ。(◎◎; ブログラマにはギャグセンスも必要っと φ(。。) メモメモ
145 名前:nobodyさん mailto:sage [02/07/10 03:22 ID:???] >>142 DBは禁句だろ。
146 名前:nobodyさん mailto:sage [02/07/10 10:54 ID:???] >>143 (゚Д゚)ハァ? >>142 が言ってるのはファイルに直接アクセスなんかしないで 排他処理が元からきちっと実装されてるDBMS使えってことだろ。 まあDBMSが使えるサーバなんて限られてるしこのスレ的にはスレ違いだとは思うが。
147 名前:nobodyさん mailto:sage [02/07/10 15:23 ID:???] >>146 MySQLやらPostgreSQLが〜となるとたしかにアレだろうけど、 BerkleyDB とかなら OS 標準で入っていることも非常に多いし、 Perl からでも使えるしナー。
148 名前:115 mailto:sage [02/07/10 16:43 ID:???] ツッコミが入らなかった・・・UNIX板へ帰ります
149 名前: mailto:sage [02/07/10 16:51 ID:???] > N人の哲学者が丸いテーブルに座っています. > テーブルの真中には大きなスパゲティの皿が置いてあります. > またN本のフォークがあって哲学者と哲学者の席の間に置いてあります. > 哲学者は思索を続けていますが,お腹がすくと両側のフォークを取って > スパゲティを食べます.お腹が一杯になると食べるのを止めてフォークを返します. > 哲学者は紳士ですから,お腹が空いていても両方のフォークが手に入るまでは待ちます. これか。このスレとは微妙に方向性が違うような。
150 名前:nobodyさん mailto:sage [02/07/10 17:38 ID:???] >>148 はっはっは!このスレのレベルの低さを思い知ったか!!
151 名前:nobodyさん mailto:sage [02/07/10 18:06 ID:???] >>147 BerkleyDBは排他制御やってねーだろ。
152 名前:nobodyさん mailto:sage [02/07/10 18:38 ID:???] >>151 MySQL が BerkleyDB の機能を使ってトランザクションを実現 しているくらいなのに、lock やってないわけなかろ。いつの version の話してるの? www.sleepycat.com/docs/reftoc.html www.sleepycat.com/docs/ref/lock/intro.html 見て出直してこい。ちなみにこの document は 4.0.14 のだけど、 3.x のころからしっかり lock subsystem がある。
153 名前:nobodyさん mailto:sage [02/07/10 21:53 ID:???] >>152 OS標準で入ってるつーと www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/db/README?rev=1.1&content-type=text/x-cvsweb-markup とかVer 1だろ。 perlのDB_Fileで2や3も使えるけど、インターフェースは1でサポートされてる部分しか使えねーはずだが。
154 名前:nobodyさん mailto:sage [02/07/11 02:02 ID:???] >>153 search.cpan.org/search?dist=BerkeleyDB 使えば? あと、FreeBSD では完全に標準な状態ではたしかにそうだけど、ふつう ports で 3.x が入ってくるし、Debian でも完全に標準では 2.x でふつう 3.x、RedHat では完全に標準で 3.x が入る
155 名前:nobodyさん mailto:sage [02/07/11 04:50 ID:???] どうせロッキングするならクリティカルな場合も考えないといけないし、 それなら車輪の再発明は止めて最初からDBMSを使うべきというのは 反論しようのない正論。しかも、リソースのありかまで教えてくれているし。 ただ、こういう極めて的確な回答があると、この手のスレはつまらなくなるね…。
156 名前:nobodyさん mailto:sage [02/07/11 06:50 ID:???] >>155 それでも、ダラダラとレスしてる奴等がいるところを見るとこの板のレベルの低さが解るね
157 名前:nobodyさん mailto:sage [02/07/11 09:23 ID:???] また釣れた(・∀・)クスクス
158 名前:nobodyさん mailto:sage [02/07/11 11:11 ID:???] DBMSやflock等の飛び道具使えないときにどうするかというパズルじゃないの?
159 名前:nobodyさん mailto:sage [02/07/11 16:21 ID:???] つかperlのflockてatomicじゃないだろ
160 名前:nobodyさん mailto:sage [02/07/11 21:02 ID:???] flock(2)使うときのflockはアトミックでしょ。 lockfでエミュレートしてるのはヤヴァイの?
161 名前:nobodyさん mailto:age [02/07/12 18:11 ID:???] # 初心者スレから誘導されてきました。 # 排他処理をしたいです。 # ローカル環境(WindowsMe+Apache+Cygwin付属のPerl)では成功するのですが、 # サーバで実行するときには、必ず失敗します(エラー表示部が実行されます)。 # もし落ち度がありましたらご教授ください。以下要所の抜粋です。 sub create_lock { my ($lockfile, $retry) = @_; while (!mkdir($lockfile, 0755)) { if (--$retry <= 0) { return undef; } sleep(1); } return 1; } sub remove_lock { my ($lockfile) = @_; rmdir($lockfile); } #上記関数の利用例 my $lock_handle = &create_lock("./lockfile", 5); if (not $lock_handle) { &print_error($resource{writedatafailed}); } #ここで処理する &remove_lock($dir_lock);
162 名前:nobodyさん mailto:sage [02/07/12 19:10 ID:???] >>161 ディレクトリに書き込み権限がない。 既にロックされている(./lockfileが存在する)。 のどちらか。 &create_lock("./lockfile", 5); と &remove_lock($dir_lock); のファイル名が…
163 名前:nobodyさん mailto:sage [02/07/12 19:38 ID:???] >>162 ご指摘ありがとうございます。(;ワ;) 今夜さっそくディレクトリの書き込み権限のチェックをしてみます。 えーと、下の $dir_lock は貼り付け時に直し忘れました(^^;) 混乱させてしまったようで、すみません。 あとでまた結果報告しにきます。
164 名前:161 mailto:sage [02/07/13 07:51 ID:???] できました〜! >>162 さん、感謝です。助かりました。
165 名前:nobodyさん [02/07/18 03:33 ID:???] 叩かれに来ました。 open(OUT, "+< outfile.txt"); flock(OUT, 2); truncate(OUT, 0); seek(OUT, 0, 0); print OUT "........"; close(OUT); の欠点を教えてください。 お願いします。
166 名前:nobodyさん mailto:sage [02/07/18 05:55 ID:???] >>165 いいんじゃないの?それでも別に。
167 名前:nobodyさん mailto:sage [02/07/18 13:34 ID:???] ........吐くだけならロックしなくて良いじゃん
168 名前:nobodyさん mailto:sage [02/07/18 14:33 ID:???] >>167 じゃあ、二つのプロセスが同時に同じファイルに対して吐きにいったら どうなる?
169 名前:nobodyさん mailto:sage [02/07/18 14:56 ID:???] open(OUT, "+< outfile.txt"); flock(OUT, 2); seek(OUT, 0, 0); print OUT "........"; truncate(OUT, tell(OUT)); close(OUT); 書き込みが終わってからtruncate()したほうが安全でちょっと速いみたい。 truncate(FILE, tell(FILE)) : 56 wallclock secs ( 8.21 usr + 39.26 sys = 47.47 CPU) @ 210.67/s (n=10000) truncate(FILE, 0) 60 wallclock secs ( 8.43 usr + 42.72 sys = 51.15 CPU) @ 195.49/s (n=10000)
170 名前:nobodyさん mailto:sage [02/07/18 15:36 ID:???] どうもならないよ、定数吐き出すだけでしょ? 正確にはsyswriteするか$|=1してバッファ使わない様にした方が良いけど
171 名前:nobodyさん mailto:sage [02/07/18 15:38 ID:???] truncateしなくて良いじゃん変数じゃ無いのに 前提が変なのに何をどうしたいのやら
172 名前:nobodyさん mailto:sage [02/07/18 15:41 ID:???] どこに定数って書いてるんだ?
173 名前:fusianasan mailto:age [02/07/18 16:45 ID:???] >>172 だれに言ってるんだ? わたしの記憶が確かなら>>170 に定数って書いてるYO!
174 名前:nobodyさん mailto:sage [02/07/18 17:11 ID:???] この棘々しい会話の流れ ( > v<)ノ タマンネー♪
175 名前:nobodyさん mailto:sage [02/07/18 17:30 ID:???] 定数だろうが変数だろうが返り値だろうが関係ないわけですが
176 名前:nobodyさん mailto:sage [02/07/18 17:34 ID:???] >>175 は? 何言いたいのおたく? もうちょっと日本語の文章力付けなさいよ
177 名前:nobodyさん mailto:sage [02/07/18 17:42 ID:???] みんなあまのじゃくさん♪
178 名前:nobodyさん mailto:sage [02/07/18 19:10 ID:???] すんげー荒れてるw
179 名前:nobodyさん mailto:sage [02/07/18 23:34 ID:???] この程度で荒れてるって言うのか。
180 名前:nobodyさん mailto:sage [02/07/18 23:43 ID:???] 荒れてるというよりみんなすさんでるな。 漢字で書いたら一緒だけど。 ま、もう当分この板はこんな調子でしょ・・・。
181 名前:nobodyさん mailto:sage [02/07/19 01:05 ID:???] この板ってほんと殺伐系だね。馴れ合い一切なし。さっぱりしてて気持ちいいけどね。
182 名前:nobodyさん mailto:sage [02/07/19 01:29 ID:???] >>165 いろいろなレスがあるけど、flockつかえるなら、それでいいんだよ。 初心者板でそう言い返してこい。
183 名前:nobodyさん mailto:hoge [02/07/19 02:38 ID:???] 突然ですが、読むだけのオープンでもflockが必要なの? 他のプロセスとの関係とかあります?
184 名前:nobodyさん mailto:sage [02/07/19 02:45 ID:???] >>165 >>1 参照。 どんな環境でもつかえてっていうのが、このスレの主題。 flockは環境によってはつかえない。 flockつかえるなら、それでいい。
185 名前:行番号でるかな mailto:sage [02/07/19 03:00 ID:???] >>183 01 open FH,"<./hoge"; 02 my @hoge = <FH>; 03 close FH; 04 # @hogeを加工、比較的重い作業 05 open FH "+<./hoge"; 06 flock (FH,2); 07 # 書き込み 2行目で配列に全部読み込んでいる、hogeの内容全部がオンメモリな状態。 今10個のプロセスが一斉に読み込みを行ったとする。 つまり10個のプロセス全てが同じ内容の@hogeを得る。 全てのプロセスが完了した時のhogeの内容はどれか一つの プロセスの内容しか反映されて居ないだろう。
186 名前:183 mailto:sage [02/07/19 03:17 ID:???] なるほど、了解しました。 どこかのサイトに読み込みオープンでもflockすべきだと 書いてあったのが気になっていたんですが、 そういう場合のことだったんですね。 ありがとうございました。
187 名前:nobodyさん mailto:sage [02/07/19 14:05 ID:???] ファイルロックなんでも相談室っぽい雰囲気になりそうだ
188 名前:nobodyさん [02/07/19 15:23 ID:H65klWUw] www.din.or.jp/~ohzaki/perl.htm#File_Lock これじゃだめか?
189 名前:nobodyさん mailto:sage [02/07/19 15:44 ID:???] timeが全く同じだと、通常のrename式と同じ問題が生じる。 まあ、可能性ははるかに低くなると思うが。
190 名前:nobodyさん mailto:sage [02/07/19 15:48 ID:???] >>189 ???????????????????????????????????????????????????
191 名前:nobodyさん [02/07/19 19:14 ID:g9uMB3Mk] >>189 同じtimeでも唯一のプロセスしかロックできないから大丈夫でない? 1秒内にロックを解除しないままプロセスが死んだ時ってこと?
192 名前:nobodyさん mailto:??? [02/07/20 21:32 ID:???] 2chはflockか?
193 名前:nobodyさん [02/07/25 16:40 ID:Ong5dr5a] 結局、実際の書き込みを、 1.ユニークなファイル名を作り書き込み。 2.指定のファイル名にrename にしときなさいってこった。
194 名前:nobodyさん mailto:sage [02/07/25 17:54 ID:???] >>193 rename時に衝突することもあるってこった。
195 名前:nobodyさん mailto:sage [02/07/26 01:04 ID:???] ファイルロック完全にやって50点。 書き込み中のプロセス事故死に対応して100点。
196 名前:nobodyさん mailto:age [02/07/26 02:18 ID:???] >>195 それでは認識が甘いな。
197 名前:nobodyさん mailto:age [02/07/26 03:55 ID:???] &unlock if($lockkey); sub unlock{ 省略 } この構文の意味がわからんから教えてくれ unlock関数とif文が何で一緒になってるんだ?
198 名前:nobodyさん mailto:sage [02/07/26 05:36 ID:???] 教えてくれ、だってさ教えてくれ!! ちょっと聞いた奥さん教えてくれ! ぷぷぷ
199 名前: mailto:sage [02/07/26 09:01 ID:???] >>197 はマルチポスト
200 名前:nobodyさん mailto:age [02/07/26 11:19 ID:???] ファイルロックって書き込み処理のときだけすればいいんですか? 読み込み処理のときにはしなくてもいいんですか?
201 名前:nobodyさん mailto:age [02/07/26 11:27 ID:???] >>192 2ちゃんはflockでした
202 名前:nobodyさん [02/07/26 13:35 ID:NvB7dZaP] &unlock if($lockkey); = if($lockkey) { &unlock; }
203 名前:nobodyさん mailto:sage [02/07/26 13:45 ID:???] >>197 && >>202 ファイルロックとは関係ないぞ。 Perl初心者スレへ。
204 名前:nobodyさん mailto:sage [02/07/28 16:44 ID:???] >>191 それでもタイムアウトまでは待つのでは? あ、正常な処理中にタイムアウトを超えてしまった場合が問題なのかな? 完璧を追求するのなら。
205 名前:nobodyさん mailto:age [02/07/29 14:41 ID:???] あげてわるいか!
206 名前:nobodyさん mailto:sage [02/07/29 14:47 ID:???] わるいっつったらどうするよ?
207 名前:nobodyさん mailto:age [02/07/29 15:10 ID:???] >>206 あげたもんはさがるまで待つしかしょーがねーだろ?って開き直るよ。
208 名前:nobodyさん mailto: [02/07/29 15:15 ID:???] homepage1.nifty.com/glass/tom_neko/web/web_04.html のページでロックの仕方が紹介されていたので使わせてもらおうと思いました。 で、「古いロックファイル(ディレクトリ)の削除」の項目にある、 $retry = 5; # リトライ回数セット while (!mkdir($lockdir, 0755)) { # 作成。出来なければ待つ if (--$retry <= 0) { # 5回ダメなら if (mkdir($lockdir2, 0755)) { # ロックを消すための排他 if ((-M $lockdir) * 86400 > 600) { # 作成時間が10分以上前なら # ロック入れ替え rename($lockdir2, $lockdir) or &error("LOCK ERROR"); last; # 一連の処理へ }else{ rmdir($lockdir2); } # 部分ロック削除 } &error("BUSY"); # あきらめる } sleep(1); # 1秒待つ } 一連の処理 rmdir($lockdir); # 削除 とりあえず、これ使っておけば大丈夫なんでしょうか。 2ちゃんねるみたいな同時アクセスが凄い場所でない限り。
209 名前:nobodyさん mailto:sage [02/07/29 15:21 ID:???] >>207 別にわるかねぇよ。
210 名前:nobodyさん mailto:age [02/07/29 15:24 ID:???] >>207 バグもあるけどキミんとこのアクセス数ならOK。
211 名前:nobodyさん mailto:sage [02/07/29 15:36 ID:???] >>210 どういう意味なんだ?
212 名前:nobodyさん [02/07/29 15:55 ID:yLhb3gGL] どこからダウンロードしたのか忘れたんだけど、 使ってるカウンター(Perl)見たら、 ロックファイル作成 ↓ ファイル読み込み ↓ ロックファイル消す ↓ カウントUP ↓ ロックファイル作成 ↓ ファイルに書き出し ↓ ロックファイル消す といった流れになってたんだけど、初めのファイル読み込みの時にもロックは必要なの?
213 名前:nobodyさん mailto:sage [02/07/29 16:25 ID:???] >>219 とんでもねぇロックの仕方だな
214 名前:nobodyさん mailto:sage [02/07/29 16:27 ID:???] >>219 はとんでもないロックを出さなければいけない。
215 名前:nobodyさん mailto:sage [02/07/29 16:32 ID:???] 219に期待sage
216 名前:nobodyさん mailto:sage [02/07/29 17:26 ID:???] >>219 はロッカー♪
217 名前:nobodyさん mailto:sage [02/07/29 17:33 ID:???] >>219 凄い。そんなアルゴリズムがあったのか。
218 名前:nobodyさん mailto:sage [02/07/29 17:35 ID:???] >>219 ある意味で、とんでもないな。
219 名前: ◆JAPH9PWA mailto:sage [02/07/29 21:21 ID:???] unless(`ps` =~ /\Q$0\E/) { # ロック権を取得したので処理をする }
220 名前:nobodyさん mailto:sage [02/07/29 22:11 ID:???] >>219 \Qと\Eの意味知らんけど、確かにとんでもないな
221 名前:nobodyさん mailto:sage [02/07/29 22:13 ID:???] Windowsでうごかねぇよ。
222 名前:nobodyさん mailto:sage [02/07/29 22:15 ID:???] 他のプロセスを全てkillする排他制御はどうか
223 名前:nobodyさん mailto:sage [02/07/29 22:17 ID:???] >>222 最強だな、うん
224 名前:nobodyさん mailto:sage [02/07/30 03:13 ID:???] >>223 なんで最強なんだ? suEXEC ならどうする?
225 名前:nobodyさん mailto:sage [02/07/30 09:03 ID:???] httpdから何から、「全て」killするからでしょ。root限定で
226 名前:nobodyさん mailto:sage [02/07/30 09:52 ID:???] そんな真面目に考えなくても
227 名前:nobodyさん mailto:sage [02/07/30 11:37 ID:???] 木村ロック
228 名前:nobodyさん [02/07/31 23:34 ID:EOzgSn6U] 書き込み中にタイムアウトになるとログが壊れます?
229 名前:nobodyさん [02/08/01 02:00 ID:DTOpJumx] >>228 に便乗 @open直後 Aprint直後 Bclose A、A〜Bでしょうか? でもopenでクリティカルな場合に吹っ飛ぶこと考えると…@?
230 名前:nobodyさん mailto:sage [02/08/01 03:58 ID:???] >>228 サーバの正常なタイムアウトなら、書き込みのシステムコールの 途中で止まったりしないでしょう。数回に分けて書き込んでたら、 止まるけど。サーバの容量制限に引っ掛かって止まる事もあるし。 >229 書き込むときに上書き(>)で開くと内容が消えるので、その直後に 止まったらアウト。 どうしてもログを守るんだったら、かならずtempファイルに書き 出して、書き込み成功を確認した後にrenameすることが必要。 ファイルサイズを計ってサイズが異様に小さいときは失敗だし、 内容をチェックすれば完璧。 これならrenameの瞬間に電源が切れるか、HDDがクラッシュする くらいの事がなければ、壊れないはず。(バグは除く) どのみち定期的なバックアップは必要かもね。
231 名前:229 mailto:sage [02/08/01 13:35 ID:???] >>230 thnx 参考になりますた
232 名前:193 [02/08/01 19:06 ID:W9oFKOXJ] >>194 だから〜。 処理ロックのファイルロックは当然かけておいて、 書き込み時はユニークファイル名に書き出してrename ってこったよ。
233 名前:nobodyさん mailto:sage [02/08/02 01:01 ID:???] >>232 アマちゃんですね。
234 名前:nobodyさん mailto:sage [02/08/03 18:57 ID:???] www.google.co.jp/search?hl=ja&inlang=ja&ie=Shift_JIS&as_qdr=all&q=site%3A2ch.net+perl&lr= >>1-233 この調子でがんばれ糞ども
235 名前:228 [02/08/03 20:27 ID:npWjw1lc] 230さま たまにログファイルが途中でぶち切れちゃうんです ファイルアップありだから でかいファイルをアップロードした時に 途中でタイムアウトするのかと思ったんですが そうでもないんですね・・・ open(DB,"+<$logdir$log_d") || &error('ファイルエラー error_24'); flock(DB, 2); my @lines=<DB>; unshift (@lines,$thred); seek(DB, 0, 0); print DB @lines; truncate(DB, tell(DB)); close (DB); これ問題ないですよね? なんでだろ・・・ flock使えない鯖なんでしょうか? 他に原因は考えられます?
236 名前:nobodyさん mailto:sage [02/08/03 23:45 ID:???] >>235 でかいファイルを全部配列に入れるのは大問題だ
237 名前:228 [02/08/04 07:59 ID:xc+iopog] >236 50件ずつにログを区切ってるんで 読み込んでるのは 書き込み50件分のデータです スレッドのタイトル一覧も表示しないといけないし・・・
238 名前:228 [02/08/04 08:03 ID:xc+iopog] やっぱ flockが使えないんでしょうか? それかtell(DB)の値がおかしくなることがあるのかな?
239 名前:nobodyさん mailto:sage [02/08/04 12:11 ID:???] >>235 > seek(DB, 0, 0); > print DB @lines; > truncate(DB, tell(DB)); 先頭にseekした後に、truncate(FH, tell(FH)) したら当然ファイルサイズ0に なるわけだが。
240 名前:230 mailto:sage [02/08/04 12:57 ID:???] データが大きくないとしても、my @lines=<DB>が失敗してるのかも。 my @lines=<DB> or &error('読み込みエラー'); としてみては? 読み込んだ大きなファイルの方にメモリを食われてるのかもしれず。 システムコール(ここではファイル操作)は常に失敗の可能性を考えて おいたほうがいいかと。flockやprintもね。
241 名前:nobodyさん mailto:sage [02/08/04 13:14 ID:???] >>235 もうちょっと問題切り分けた方が良いよ マルチパートだと思うんだけど、変なモジュールを使って データ千切れちゃってるとか。 Niftyはflock空振りサーバの代名詞だけど大丈夫? 適当にsleepしてウェイトかけながらテストするとか シグナル関係全部無視するとか 基本的に共用ならサーバからkillされる様な使い方は 間違ってると思うよ もし自分のなら、さっさとコネクション切ってじっくりと作業すれば 良いだけなんだけど サーバのBBSとかFAQは読んでる? >>239 それは print 〜 が有るから問題無い と言う事で、一応。
242 名前:239 mailto:sage [02/08/04 14:38 ID:???] >>241 正直、スマンカッタ。
243 名前:nobodyさん mailto:sage [02/08/04 15:21 ID:???] で、なにが最強なの?
244 名前:228 [02/08/04 21:59 ID:etatASlj] レスありがとうございます 最初から書いとくべきだったんですが 説明を付け足すと 2chタイプの掲示板なんです でログファイルへの書き込みはこの部分だけです カウンターなんかも同じ方法で書き込みしてるんですが それは飛んだことないんです で、ログファイルへの書き込みが処理の最後の方なので 遅い回線でファイルアップした時にデータを送るのに 時間がかかり途中でCGIが止まる事があるのかな? と考えてたのです(最後の方の処理のログファイルが影響受けやすいと) でも、どういう条件でログが消えるのかは特定できてません スレッド50件記録のうちの途中(全部じゃないです。例えば36件目とか)で 消えてしまいます(メッセージが途中までしかなかったり)・・・ (レスは別ファイルなのですが、そっちは消えません) >読み込んだ大きなファイルの方にメモリを食われてるのかもしれず。 そういう制限もあるんですね試してみます >もうちょっと問題切り分けた方が良いよ でも、書き込みしてるのこの部分だけなんですよ やっぱflockが使えなくて 他のプロセスの書き込み中のデータを読み込んでるとログが途中で消えますよね? でも、カウンターは消えないんですよ・・・ (それともそのうち消えるんでしょうか?ファイルサイズが小さいから確率が低いだけ?) >サーバのBBSとかFAQは読んでる? すいません、その辺、勉強してきます
245 名前:nobodyさん mailto:sage [02/08/04 22:48 ID:???] >>244 一度flock以外のロックで試してみれば? こういうのが問題を切り分けるって事じゃないのか。
246 名前:230 mailto:sage [02/08/05 01:30 ID:???] データのどこで切れるかが重要。 1.flockが利かない場合は、まるっと新規発言が記録されないか、書 き込みの後のtruncateで半端な位置で切られるわけで、それぞれの 発言内容の量にさほど違いが無いなら、48〜50発言目くらいの後ろ の方で切れるはず。 2.新規発言の処理に問題あるなら、unshiftで入れた1発言目(あとで 気が付いたなら数発言目)で切れるが、その後ろの発言まで消える事 は無い。 3.書き込みが全面的に失敗し、書き込まれて無いのに切り詰めれば ログ丸ごと消える。(ずっとあとになって気が付けば36発言目になっ てたりするが) というわけで、36発言目で切れるなら問題は 1.読み込み(my @lines=<DB>) 2.書き込み(print DB @lines) 3.切り詰め(truncate(DB, tell(DB))) の3個のどれかが失敗してると考えられるよね。それぞれ失敗時には エラーにしないと。で、これらが失敗する原因は、メモリ使用量や ディスク容量の制限、あるいはサーバの混雑にありそう。 途中まで書き込んでprintが失敗してるんなら、tempファイル式にす るしか無いけど、まずは上記の対策してから。
247 名前:228 [02/08/06 00:52 ID:eY1Nkha6] my @lines=<DB> || &error('読み込みエラー'); にしたら 最初の一行しか読まないんですが・・ すいません・・・
248 名前:nobodyさん mailto:sage [02/08/06 01:13 ID:???] 評価順位って知ってる? (@lines=<DB>) その他力本願ぶりじゃ先は真っ暗っぽいね
249 名前:228 [02/08/06 01:14 ID:HdiBMgeW] or にしたら ちゃんと動きました or と || とは違うんですか? はぁ・・
250 名前:228 [02/08/06 01:29 ID:AoKqt/pr] おお、わかりました ありがとうございます
251 名前:nobodyさん mailto:sage [02/08/06 06:51 ID:???] >>248 ハァーーーーーーーー 眠たい
252 名前: mailto: [02/08/06 09:00 ID:???] >>251 何が眠たいんだ? my (@lines=<DB>) || &error('読み込みエラー'); で動いてるんだが、向学の為に教えて欲しい
253 名前: ◆JAPH9PWA mailto:sage [02/08/06 09:12 ID:???] >>249 orは||より優先度がずっと低いんだよ。 だから @lines = <DB> or error; は (@lines = <DB>) or error; と評価され、 @lines = <DB> || error; は @lines = (<DB> || error); と評価される。 ||演算子のオペランドはスカラコンテキストで評価されるから、 結果として一行しか読み込まれないことになる、というわけね。 >>252 < my(@lines = <DB>) > (my(@lines) = <DB>)
254 名前: mailto:age [02/08/06 15:22 ID:???] >>253 優先度を云々するのなら、= と || および = と or について言わないと意味ナイだろ。
255 名前: ◆JAPH9PWA mailto:sage [02/08/07 10:19 ID:???] >>254 そういえばそうだ。肝心な所が抜けててごめん。 >>253 追記 とりあえず、代入演算子は比較的優先順位が低くなってるんだよ。 例えば、算術演算子や比較演算子などは全て代入演算子より優先度が高い。 だからこそ $foo = 100 + 200; という式が ($foo = 100) + 200; ではなく、$foo = (100 + 200);と評価される。 で、||や&&といった演算子は代入演算子よりも優先順位が高いため、 加算演算子と同様の評価順序になるってわけ。 しかしながら、orやandといった演算子の優先順位は代入演算子のそれより低いので、 このケースの場合は期待通りに動くわけだね。 詳細についてはついてはperldoc perlopを参照のこと。
256 名前: ◆JAPH9PWA mailto:sage [02/08/07 10:21 ID:???] ていうかここはファイルロックスレじゃないか! スレ違いもいいとこだね。とほほ…
257 名前:228 mailto:sage [02/08/10 00:33 ID:???] おかげであれからログが消えてません open(LOG,"+<$log") || &error('ファイルエラー'); flock(LOG, 2) or &error('ロックエラー'); my @lines = <LOG> or &error('読み込みエラー'); 〜〜〜更新処理〜〜〜 seek(LOG, 0, 0); print LOG @lines; truncate(LOG, tell(LOG)); close (LOG); こんな感じです やっぱり同時刻に書き込みが集中した時に消えるようなので KENT式mkdirロックを少し改造したものをあわせて使ってます そのまま使うとエラーでロックを外した瞬間に書き込みが重なってしまうようなので・・・ ありがとうございました
258 名前:230 mailto:sage [02/08/10 06:54 ID:???] >>257 >そのまま使うとエラーでロックを外した瞬間に書き込みが重なってしまう ロックを外したら、もはやそのプロセスは書き込まないはず。 まさか&errorでexitせずに、実行続けてるとか? mkdir式が有効なのは、flockがダメだったからかもしれないが、 処理が遅くなるのとタイムアウトがある事で、読み書きが集中 しないようになった効果かもしれない。 質問者は問題が解決しさえすればいいんだが、 flockとmkdir式の併用なんて気持ちわるい結末だなぁ。
259 名前:228 mailto:sage [02/08/10 18:58 ID:???] >ロックを外したら、もはやそのプロセスは書き込まないはず。 どんなエラーでもロックを外してしまうので 書き込み中の人がいて、それ以外の人がエラー出してロックを外してしまう というのが問題でした 上で書いてるのはちょっと違いました。。 いろいろ教えて頂いたのに、はっきり原因を解明せずに 気持ち悪い結末にしてしまって申し訳ないですが 上のflockのみではprintで失敗したらどうしようもないのなら mkdirを併用する方法はいいんじゃないかと思うんですが・・
260 名前:230 mailto:sage [02/08/10 22:16 ID:???] >>259 書き込み中の人がいるとしたら、その人しかロックが成功していないので、 それ以外の人がロックを外す事はありえないのが排他制御。 mkdir式の場合、ロック成功したプロセスがエラーで外すなら問題ないわけ。 通常、ロックを成功してないプロセスがロックを外すようなのはバグ。 flockの場合はロックかけたプロセス以外は外せないよ。 > printで失敗したらどうしようもない mkdirを併用しても同じ状況だけど。 print LOG @lines or &error('書き込みエラー'); でOK。truncateする前にやめればデータは壊れない。 とにかく、mkdir式にするならflockは必要ないので消そうよ。
261 名前:nobodyさん mailto:age [02/08/11 12:39 ID:???] 結局KENTかよ!!!
262 名前:nobodyさん mailto:sage [02/08/11 12:53 ID:???] flock使えるならflockにしとけよ!!!
263 名前:nobodyさん mailto:sage [02/08/11 13:45 ID:???] flockよりKENTが優れていることが証明されました!!!
264 名前:nobodyさん mailto:sage [02/08/11 13:46 ID:???] どこで?
265 名前:KENT mailto:sage [02/08/11 15:40 ID:???] flockってカエルだよね?
266 名前: mailto:sage [02/08/11 15:50 ID:???] おはロックが有効な鯖ってあるの?
267 名前:nobodyさん mailto:sage [02/08/11 19:41 ID:???] >>228 だから初めにflock効いてるのか調べてと言ってるのに 空振りしてるんだよ、それ 他のファイル編集部分は時間的にロック無しでも動いてるだけだよ多分
268 名前:nobodyさん mailto:sage [02/08/11 21:39 ID:???] 「多分」って便利な言葉 俺は断言してないよ、忙しかったしよって感じ
269 名前:nobodyさん mailto:age [02/08/14 01:12 ID:???] www.kent-web.com/support/wforum.cgi?mode=allread&no=3986&page=0 排他処理とはちょっとズレるかもしれないが、これは立派にシステム上に矛盾が起きてるんだから、"バグ"ではないにしろ、立派な不具合だよな… この不具合って、そんなに難しいことなのかな… あたりまえのように、こういうのは想定しないかな? Kentのスクリプトって、こういうところが馬鹿だよね。
270 名前:nobodyさん [02/08/14 01:45 ID:7AoVgCGe] homepage1.nifty.com/glass/tom_neko/web/web_04.html#lockall このまとめてロックっていいんですか?
271 名前:nobodyさん mailto:age [02/08/14 02:02 ID:???] >>270 ,一-、 / ̄ l | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ■■-っ < んな こたーない ´∀`/ \__________ __/|Y/\. Ё|__ | / | | У.. |
272 名前:nobodyさん [02/08/14 02:05 ID:7AoVgCGe] やっぱだめなんですか
273 名前:nobodyさん [02/08/14 02:14 ID:7AoVgCGe] 他にいい方法はありませんか?
274 名前:nobodyさん mailto:sage [02/08/14 04:31 ID:???] ヅラを強力ロック
275 名前:nobodyさん [02/08/14 20:00 ID:DbQN4DsP] 監獄ロック
276 名前:nobodyさん mailto:sage [02/09/14 03:01 ID:???] 慎吾ママの
277 名前:nobodyさん [02/10/01 08:47 ID:OVvB7u9F] kagino110.hp.infoseek.co.jp/sub18.htm 強力なロックだ
278 名前:nobodyさん mailto:sage [02/10/01 14:48 ID:???] >>277 ううむ、強力すぎてアクセスさえもできないよ!
279 名前:名無しさん@お腹いっぱい。 mailto:sage [02/10/01 16:34 ID:???] >>278 漏れは開きすぎちゃったよ。windows再起動した。 皆気をつけろよ。中のどれか開いたりしたら、国際電話だぞ。
280 名前:名無しさん@お腹いっぱい。 mailto:sage [02/10/04 08:00 ID:???] ム板の「Perlについての質問箱」がruby基地外によって潰されました。 心ある人は、rubyスレにお礼参りしてください。
281 名前:nobodyさん mailto:sage [02/10/08 18:16 ID:???] >>277 ちょっとワラタ
282 名前:nobodyさん [02/10/11 23:24 ID:0pBUR/gh] read.cgiのファイルロック。これ最強
283 名前:nobodyさん mailto:sage [02/10/12 00:02 ID:???] >>282 どういうロックやってるの? 知らないから教えてくれ。
284 名前:nobodyさん mailto:sage [02/10/15 14:15 ID:???] ロックなんかしてないよ 2chの負荷でロックなんかしたら使い物にならん 壊れてたら読み直せばすむことだし
285 名前:nobodyさん [02/10/15 18:19 ID:jOp8uFKz] bbs.cgiはどうやってるの?
286 名前:nobodyさん mailto:sage [02/10/16 11:23 ID:???] 日時とスレッドキーなんかを含めたファイル名で 一時ファイルを作って書き込み終わったら subject.txtにリネーム renameのアトミック性に頼ってるわけだな datはふつうにflockしてるだけ
287 名前:nobodyさん mailto: [02/10/22 13:32 ID:???] わたし 思う。 ロック機能作る。 理論的 このスクリプト完璧。 でも どうテストする。 アルバイト100人雇う。 100人いっせいにアクセスする。 そんな 手間かけられない。 どうする。 2ちゃんねるに晒す。 それ怖い。 どうする。
288 名前: mailto:sage [02/10/22 16:25 ID:???] ・ 実験しないで本番に使う。 ・ 覚悟して晒す。 ・ 一年生になって友達100人つくる。
289 名前:nobodyさん mailto:sage [02/10/22 16:39 ID:???] >>287 不覚藁
290 名前:nobodyさん mailto:sage [02/10/22 17:09 ID:???] >>287 100 スレッド立ててアクセスしまくるにきまっとろーが。
291 名前:nobodyさん [02/10/27 19:23 ID:zFNcoqUs] >>185 別人ですが、読み込んだものを加工してまた書き込む場合には 読み込むときにもロックが必要なんですね? 単に読み込んで、例えば表示したいだけで 加工もしない場合は必要ないんですよね。
292 名前:nobodyさん mailto:sage [02/10/27 21:19 ID:???] ログ更新中に読み出したらおかしな内容になってしまう。ロックは必要。
293 名前:nobodyさん mailto:sage [02/10/27 22:41 ID:???] テストスクリプトはlock握って数十秒眠るようにするわけだ。勿論タイムアウト値の調整は必要だ。 そうすりゃ一人でもテストできるだろ。
294 名前:nobodyさん mailto:sage [02/10/28 01:48 ID:???] >>292 表示がおかしかったら読み直してもらうという アプローチもありうる(read.cgiとか)。
295 名前:nobodyさん [02/10/29 01:24 ID:3RRgraL5] flockについて、説明として例えば flock(XX, 2) 書込中だから書込読込ロック、あとから来たら待つ。 とあるのですが、待つってどのくらい待つことが出来るのでしょう…? 上限や目安みたいなものはあるのでしょうか?
296 名前:nobodyさん mailto:sage [02/10/29 01:40 ID:???] >>295 めっちゃ、待つでぇ
297 名前: ◆hMJAPH9PWA mailto:sage [02/10/29 09:26 ID:???] >>295 実行者が我慢できなくなってkillするまで、ずっと待つよ。 で、それじゃこまるからってんでブロックしないモードがある。 use Fcntl qw(:flock); flock FH, LOCK_EX | LOCK_NB or die "ロック失敗:$!";
298 名前:nobodyさん mailto:sage [02/10/29 09:56 ID:???] もっともブロックしないで無限ループするくらいなら ブロックして待ったほうがましだが
299 名前:nobodyさん mailto:age [02/11/03 16:56 ID:???] 大事件発生! rename を使った完璧なファイルロックが完成してしまいました。
300 名前:nobodyさん mailto:sage [02/11/03 18:41 ID:???] 外出です
301 名前:nobodyさん [02/11/05 18:35 ID:5Ci8Aq1y] んむ・・・。
302 名前:perlお勉強ちゅー [02/11/29 01:12 ID:vd7dmowT] >>299 こんな感じかな、 my($process)=$$; open (IN,"data.txt"); flock (IN,2); open (OUT,">$process.tmp"); flock (OUT,2); #hogehoge処理 close (IN); close (OUT); rename ("$process.tmp","data.txt"); 不安なんですけど、これで良いのでしょうか?皆様。
303 名前:perlお勉強ちゅー mailto:sage [02/11/29 01:54 ID:???] ↑ open の戻り値チェックしてなかった。スマソ
304 名前:私も勉強中 mailto:sage [02/11/29 17:19 ID:???] close (OUT); から rename ("$process.tmp","data.txt"); までの間に、他のプロセスが open (OUT,">$process.tmp") を 実行してしまい、$process.tmpが空になる可能性がある。 ※open (OUT,">$process.tmp")した瞬間 $process.tmpのファイルサイズが0になるので、 次の flock (OUT,2) で止めても手後れ。 そんな気がするが、どうだろうか。
305 名前:304 mailto:sage [02/11/29 17:25 ID:???] ごめん、間違えた。 tmpファイルの名前を毎回変えれば大丈夫か。
306 名前:nobodyさん mailto:sage [02/11/29 19:16 ID:???] >>302 普通に、だめだね。 たとえば、Aプロセスがclose(OUT)まで行く、その直後にBプロセスが open (IN,"data.txt");、でそのあとAプロセスがrename、Bプロセスは 普通に終了するけど、BのINは、Aが変更を加える前のdata.txtなので Bがrenameした時点で、Aで加えた変更は破棄される。
307 名前:perlお勉強ちゅー mailto:sage [02/11/30 00:18 ID:???] >>304 さん >>306 さん ご解説して下さってありがとうございます。 close しなければ rename できないと勝手に 思い込んでいました。(やってみたらできました) close したときに flock が解除されるのなら rename 後に close しとけば別プロセスに割り 込まれることが減り、少しはましになるかな。
308 名前:nobodyさん mailto:sage [02/11/30 15:54 ID:???] >>307 > rename 後に close だめ。 AプロセスがINをopen、直後にBがINをopen、Aがflockして処理を おえる、Bがflockを獲得して処理を終える。これでも、BのINはAが変更を 加える前のdata.txtなので、同様にAの変更が破棄される。 なおかつ、Win環境だとopen中のファイルのrenameはできなかったような?
309 名前:私も勉強中 mailto:sage [02/11/30 16:23 ID:???] open (LOCK,"lock"); flock(LOCK,2); open (IN,"data.txt"); open (OUT,"date.tmp"); #hogehoge処理 close (IN); close (OUT); rename ("date.tmp","data.txt"); close (LOCK); INの前にflockするという方向で考えると、こうなるのか? renameを使ったファイルロックと言っていいのかどうか分からないが。
310 名前:nobodyさん mailto:sage [02/12/01 00:55 ID:???] >>309 flock は、とりあえず >>1 の条件に反するので0点ってとこかな?
311 名前:perlお勉強ちゅー mailto:sage [02/12/01 14:43 ID:???] >>308 またもやありがとうございます。 rename 後の close を Windows2000 で試したところ、 ご指摘のとおりエラーになりました。 open してから flock するまでに間が空くのがいけないと思い、 今度はフラグを立てるタイプを考えてみましたが、 フラグが立ってるか判別するまでに間が空く・・・ 私には解決が難しいので人のソースでもっと勉強してみます。
312 名前:cron [02/12/02 11:25 ID:YojCbNB7] ちょっと教えてほしいんだけど。。 Perlでロックしていてもcronでroot権限でrenameしてしまえるみたいなんだけど Perlで複数のユーザーがどんどん書き加えていくファイルを何分か置きに root権限で実行したい場合 問題の起こらない良い方法はありますか?
313 名前:nobodyさん mailto:sage [02/12/02 11:37 ID:???] >>312 rootで何をしたいのか?
314 名前:cron [02/12/02 13:01 ID:YojCbNB7] rootでしか実行できないコマンドを実行させるのに そのコマンドのオプションはCGIで書き込ませたいのです。
315 名前:nobodyさん [02/12/02 14:26 ID:Vw2f1Ru9] >>314 ネタだよなぁぁぁぁ、頼むからネタだと言ってくれー
316 名前:cron [02/12/02 15:25 ID:YojCbNB7] なんで?おかしかった?ちゃんと教えてください
317 名前:☆☆☆☆☆ [02/12/02 15:47 ID:Z6bI7Cqn] alink3.uic.to/user/ranran2.html
318 名前:nobodyさん mailto:sage [02/12/02 22:12 ID:???] オプティミスティック オプティミスティック オプティミスティック ペシミスティック ペシミスティック ペシミスティック あー、言いにくい
319 名前:nobodyさん mailto:sage [02/12/06 00:00 ID:???] >>316 あのさあ、rootって管理人のことだろ? どこの鯖缶が赤の他人にroot権限使わせるってのよ。 やるんなら自鯖立ててやんなよ。
320 名前:Perlお勉強ちゅー mailto:sage [02/12/06 01:16 ID:???] アトミックというのと、入出力の処理全体を包み込むというのが ファイルの排他処理のキーワードらしいとわかってきました。(つもり) フラグにするものがアトミックというのは、例えれば、 一組のトランプからはクラブの 1 は 1 枚しか引けないからこそ 目印になるということかな。親元になければ誰もカードを取れないものね。 気になったのは、アトミックがいくつかの使われ方をしている事で、 1 : 現在の ファイル I/O では HDD への読み書きは物理的には一つしかできないことに依存してフラグを立てる。 (HDD の複数ヘッドがばらばらに動いてたらこわいです。) 2 : Perl 上で処理全体をアトミックにと言う場合は、「読み」「処理」「書き」を 「1」に依存して、他人(他プロセス)に口をはさませずに行う。 ・・・って感じかな。 # 見当違いでしたらつつしんで怒られます。とほ。 # お勉強中途報告でスマソ。
321 名前:cron [02/12/08 07:08 ID:tHo7Ijtw] >>319 root権限で当然、自サバでするんだよ cronのことしらないの?
322 名前:nobodyさん mailto:sage [02/12/08 08:24 ID:???] >>321 cronで動かすプログラムとWebプログラムでのファイルのロックが問題なの? 普通のファイルロックと同じようにやればいいじゃん。
323 名前:319 mailto:sage [02/12/08 11:44 ID:???] >>321 自鯖でやるなんて一言も言わなかったじゃないか。 そもそも、自分が鯖缶だとも言ってない。 cronでCGI動かすようにすれば? んで、CGIの方でロックをきちんとすればいい。
324 名前:nobodyさん mailto:sage [02/12/08 11:44 ID:???] やればいいじゃん。
325 名前:nobodyさん mailto:sage [02/12/08 12:07 ID:???] >>323 cronでCGI動かすなんてアホな発想はどこから出てくるんだ?
326 名前:nobodyさん mailto:sage [02/12/08 12:11 ID:???] 出てくるんだ?
327 名前:nobodyさん mailto:sage [02/12/08 16:05 ID:???] お前らいいかげんにネタだと気付け。 > Perlで複数のユーザーがどんどん書き加えていくファイルを何分か置きに > root権限で実行したい場合 問題の起こらない良い方法はありますか? 「複数のユーザが書き換えるファイル」を「root権限で実行」する馬鹿が本当にいると思ってるのか?
328 名前:山崎渉 mailto:(^^)sage [03/01/15 13:42 ID:???] (^^)
329 名前:nobodyさん [03/01/17 10:53 ID:t5G3aPWp] open(ABC "<$hoge") || &error("error"); とかよくやりますが close(ABC); 閉じるときも close(ABC) || &error("error"); とやるべきでしょうか? closeに失敗することあるんでしょうか?
330 名前:nobodyさん [03/01/17 12:29 ID:+SxK8G04] >>329 非常にいい質問だね。 さ、誰か答えてやんなさい。
331 名前:nobodyさん mailto:sage [03/01/17 13:58 ID:???] while (!close(ABC)) {}
332 名前:nobodyさん mailto:sage [03/01/18 00:49 ID:???] perl -e 'close(STDIN); close(STDIN) || die $!' それがどうファイルロックと関係あるのかと
333 名前:nobodyさん mailto:sage [03/01/18 14:04 ID:???] ファイルロックしている最中にcloseに失敗してエラー処理をせずに 処理が終了されて、ロック解除できずロックファイルが残る場合。
334 名前:nobodyさん mailto:sage [03/01/18 17:36 ID:???] Apacheのアクセスログなんか尋常じゃないほどの書き込みがあるが どうして上手くいっているのだろうか?
335 名前:nobodyさん mailto:sage [03/01/18 18:30 ID:???] >>334 O_APPEND
336 名前:nobodyさん mailto:sage [03/01/18 20:35 ID:???] >>333 エラー処理の中にバグを入れるのは本末転倒だろうが。
337 名前:nobodyさん mailto:sage [03/01/18 20:51 ID:???] >>335 ファイルの追加書き込みって上手く使うとflockないシステムでも上手くロックをかけれるかも
338 名前:nobodyさん mailto:sage [03/01/19 23:58 ID:???] >>337 ロックじゃねーよ。
339 名前:世直し一揆 [03/01/30 10:23 ID:EZ4VgkoJ] <血液型A型の一般的な特徴>(見せかけの優しさ・もっともらしさ(偽善)に騙され るな!) ●とにかく気が小さい(神経質、臆病、二言目には「世間」、了見が狭い) ●他人に異常に干渉し、しかも好戦的・ファイト満々(キモイ、自己中心) ●自尊心が異常に強く、自分が馬鹿にされると怒るくせに平気で他人を馬鹿にしようと する(ただし、相手を表面的・形式的にしか判断できず(早合点・誤解の名人)、実際に はたいてい、内面的・実質的に負けている) ●本音は、ものすごく幼稚で倫理意識が異常に低い(人にばれさえしなければOK) ●「常識、常識」と口うるさいが、実はA型の常識はピントがズレまくっている(日本 の常識は世界の非常識) ●権力、強者(警察、暴走族…etc)に弱く、弱者には威張り散らす(強い者に弱く 、弱い者には強い) ●あら探しだけは名人級(例え10の長所があってもほめることをせず、たった1つの短所を見つけてはけなす) ●基本的に悲観主義でマイナス思考に支配されているため性格がうっとうしい(根暗) ●一人では何もできない(群れでしか行動できないヘタレ) ●少数派の異質、異文化を排斥する(差別主義者、狭量) ●集団によるいじめのパイオニア&天才(陰湿&陰険) ●悪口、陰口が大好き(A型が3人寄れば他人の悪口、裏表が激しい) ●他人からどう見られているか、人の目を異常に気にする(「世間体命」、「〜みたい 」とよく言う) ●自分の感情をうまく表現できず、コミュニケーション能力に乏しい(同じことを何度 も言ってキモイ) ●表面上意気投合しているようでも、腹は各自バラバラで融通が利かず、頑固(本当は 個性・アク強い) ●人を信じられず、疑い深い(自分自身裏表が激しいため、他人に対してもそう思う) ●自ら好んでストイックな生活をし、ストレスを溜めておきながら、他人に猛烈に嫉妬 する(不合理な馬鹿) ●執念深く、粘着でしつこい(「一生恨みます」タイプ) ●自分に甘く他人に厳しい(自分のことは棚に上げてまず他人を責める。しかも冷酷) ●男は、女々しいあるいは女の腐ったみたいな考えのやつが多い(例:「俺のほうが男 前やのに、なんでや!(あの野郎の足を引っ張ってやる!!)」)
340 名前:nobodyさん [03/01/30 12:26 ID:RKDiglA0] 最近運用してるページでロックがよく残る、書き込みファイルがロックしてるにもかかわらず 壊れるという現象が頻発して困ります。 なにか他のいい方法を探しているのですが 書き込み待ちテンプを作るやり方があると聞いたのですが 教えてください。
341 名前:nobodyさん mailto:sage [03/01/30 13:08 ID:???] >>340 マジレス お前のロックの仕方が変なだけ
342 名前:nobodyさん [03/01/31 04:05 ID:QdG4FrQH] 画像貼り付け掲示板なのですが どのようにロックかけるのがのぞましいのでしょうか?
343 名前:nobodyさん [03/01/31 07:27 ID:K4VaGHSu] いいサイトだ♪homepage3.nifty.com/digikei/ten.html ♪
344 名前:nobodyさん mailto:sage [03/01/31 20:55 ID:???] 安全なようにロックをかけるのが望ましい
345 名前:nobodyさん [03/02/01 03:10 ID:6WMjWs0+] ∧∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ (,,゚Д゚)< みんなで視姦汁! ./ | \________ .______(___/_____ .|03. 2. 2. / AHE | .|________________| /\ \ / \ 2003年2月2日 \ / Λ_Λ \ .13:00… \ /__( ´д`)_\______________\ | |ゲ.| │ | | |.ロ | │ 梅田丸ビルの .| | |ゲ.| │ 電光掲示板に… .| | |.ロ | │ ..『(゚д゚)ウマー』 | |γ__ |ゲ.| │ ̄\ / ̄| | \ |.ロ | │ \_________/ | | |ゲ.| │ │ |____|__||_|)|.ロ | │ コ ッ プ 1 杯 .│ |□━□ ) │ . ( 約 200ml ) で | | J |) / ̄ ̄ |. 1 日 分 の * .| | ∀ ノ < ヒヒヒヒヒ | 黄色ブドウ状球菌 | | - ′ . \____ | 2 分 の 1 | | ) │ │ |/. 製 造 ..| │ | . 逝印大阪工場 . | 500 ml | |____________________|______________| life2.2ch.net/test/read.cgi/offreg/1043075025/l50
346 名前:nobodyさん mailto:sage [03/02/01 03:23 ID:???] なんだ、騙されたスレじゃないのか
347 名前:nobodyさん mailto:sage [03/02/19 23:23 ID:???] よくチャックがあけっばなしと言われます
348 名前:山崎渉 mailto:(^^) [03/03/13 17:22 ID:???] (^^)
349 名前:nobodyさん mailto:sage [03/03/13 22:46 ID:???] >>329 ログの閉じミスなんて気にしなくても。。。
350 名前:nobodyさん mailto:sage [03/03/22 18:02 ID:???] どうせさほどアクセスが多いところじゃないんだろうから、mkdirと強制ロック解除のパターンでいいじゃん。
351 名前:nobodyさん [03/04/17 00:56 ID:s+I4ylgd] Perlメモの www.din.or.jp/~ohzaki/perl.htm#File_Lock を使おうと思ったんですが、 なにげにperl初心者なんで、その使い方がわかりません。 perlメモには、 $lfh = my_flock() or die 'Busy!'; # アンロックする my_funlock($lfh); $lfh にはなにをいれれればいいのでしょう?ファイル名?ファイルハンドル?
352 名前:nobodyさん mailto:sage [03/04/17 02:26 ID:???] なにも
353 名前:山崎渉 mailto:(^^) [03/04/17 11:58 ID:???] (^^)
354 名前:351 [03/04/17 22:16 ID:PczzXVDV] >>352 どういうこと?
355 名前:佐々木健介 mailto:sage [03/04/17 22:16 ID:???] ______ /_ | /. \ ̄ ̄ ̄ ̄| / / ― ― | | / - - | ||| (5 > | | | | ┏━┓| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | | | | ┃─┃| < こんなサイトを見つけた || | | | \ ┃ ┃/ \ 正直、スマンカッタ | || | |  ̄ \_________ freeweb2.kakiko.com/tama/
356 名前:nobodyさん mailto:sage [03/04/17 22:26 ID:???] >>354 なにげにが気に入らないから教えない
357 名前:bloom [03/04/17 22:56 ID:ahUYqmP+] www2.leverage.jp/start/
358 名前:nobodyさん mailto: [03/04/17 22:57 ID:???] なんでDB使わないの?
359 名前:あぼーん mailto:sage [03/04/17 23:23 ID:???] ( ・∀・)/< こんなのみつけたっち♪ www.japan.pinkserver.com/yamazaki/saitama/hankaku06.html www.japan.pinkserver.com/yamazaki/saitama/hankaku05.html www.japan.pinkserver.com/yamazaki/saitama/hankaku03.html www.japan.pinkserver.com/yamazaki/saitama/hankaku04.html www.japan.pinkserver.com/yamazaki/saitama/hankaku01.html www.japan.pinkserver.com/yamazaki/saitama/hankaku02.html www.japan.pinkserver.com/yamazaki/saitama/hankaku09.html www.japan.pinkserver.com/yamazaki/saitama/hankaku10.html www.japan.pinkserver.com/yamazaki/saitama/hankaku07.html www.japan.pinkserver.com/yamazaki/saitama/hankaku08.html
360 名前:nobodyさん mailto:sage [03/04/18 23:20 ID:???] >>358 一回使ったらまた集めなきゃならないだろ。
361 名前:nobodyさん [03/04/19 13:00 ID:EJZQKwDz] homepage1.nifty.com/glass/tom_neko/web/web_04.html に載ってる「ファイルを上書きする場合」(↓) open(OUT, "+< $datafile"); # 読み書きモードで開く flock(OUT, 2); # ロック確認。ロック seek(OUT, 0, 0); # ファイルポインタを先頭にセット print OUT "$data\n"; # 書き込む truncate(OUT, tell(OUT)); # ファイルサイズを書き込んだサイズにする close(OUT); # closeすれば自動でロック解除 を参考にして、 「(1)ファイルの中身(データ)を読み込んで、読み込んだデータを加工して、 (3)再度同じファイルにデータを格納する場合」を考えたんだけど、 ↓で特に問題ないでしょうか? $datafile = "data.txt"; open(OUT, "+< $datafile"); # 読み書きモードで開く flock(OUT, 2); # ロック確認。ロック @Array_data = <OUT>; # ★追加:(1)ファイルの中身を読み込んで foreach $values (@Array_data){ #@Array_dataをいろいろ加工; # ★追加:(2)読み込んだデータを加工 chomp $values; $values = $values * 2; push (@New_Array_data,"$values\n"); } seek(OUT, 0, 0); # ファイルポインタを先頭にセット print OUT @New_Array_data; # ●変更:(3)再度同じファイルにデータを格納 truncate(OUT, tell(OUT)); # ファイルサイズを書き込んだサイズにする close(OUT); # closeすれば自動でロック解除
362 名前:nobodyさん mailto:sage [03/04/19 15:13 ID:???] >>361 うん、これで問題ないね
363 名前:nobodyさん mailto:sage [03/04/19 19:05 ID:???] > ★追加:(2)読み込んだデータを加工 この最中に逝っちゃっても大丈夫?
364 名前:nobodyさん mailto:sage [03/04/19 19:45 ID:???] >>363 途中でプロセスが死んだらどんなことしたって壊れるときは壊れる
365 名前:山崎渉 mailto:(^^)sage [03/04/20 06:00 ID:???] ∧_∧ ( ^^ )< ぬるぽ(^^)
366 名前:: [03/04/21 18:06 ID:J93Hac+3] ☆^〜^★ 50音順で探せて楽して得する sagatoku.fc2web.com/ あなたの探し物きっとみつかるよ☆^〜^★
367 名前:nobodyさん mailto:sage [03/04/21 21:46 ID:???] >>364 駄目じゃん
368 名前:nobodyさん mailto:sage [03/04/21 22:35 ID:???] >>367 たかが趣味でやってるCGIのデータなんだから気にしすぎ 壊れたらどうやって対処するかスキルを身に付けるいいチャンス
369 名前:nobodyさん mailto:sage [03/04/21 23:09 ID:???] >>368 そういう誤魔化し方は好きじゃないな
370 名前:nobodyさん mailto:sage [03/04/21 23:33 ID:???] 書いてる途中で死んでもジャーナルファイルシステムの恩恵にあずかれたりしない?
371 名前:nobodyさん mailto:sage [03/04/21 23:54 ID:???] どんなことしても、壊れる物は壊れる。 イヤなら定期的にバックアップ取る処理を組め。
372 名前:nobodyさん mailto:sage [03/04/22 14:19 ID:???] 突然死するトランザクションは救えないが、DBが壊れないようにすることは可能。
373 名前:nobodyさん mailto:sage [03/04/22 20:26 ID:???] これだけ粘着的にこだわって、実は IDE で RAID も組んでません、とかいうオチはないよな?
374 名前:nobodyさん mailto:sage [03/04/22 20:41 ID:???] 妥協しないぐらい食材にこだわって、実は化学調味料ドバドバ入れちゃうみたいな?
375 名前:っていうか mailto:sage [03/04/24 13:03 ID:???] 別ファイルに書き込んで mv これ定説
376 名前:山崎渉 mailto:(^^) [03/05/22 02:08 ID:???] ━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
377 名前:nobodyさん mailto:sage [03/05/22 07:17 ID:???] 厨房な質問で悪いんですが、mkdirを使ったファイルロックってこういうことですか? if (opendir(LOCK, "lock")) { closedir(LOCK); rmdir("lock"); # 処理 mkdir("lock"); }
378 名前:nobodyさん [03/05/22 09:34 ID:sAd9/kNT] mkdir("lock") じゃなくて mkdir("lock", 600) でした。
379 名前:nobodyさん mailto:sage [03/05/22 10:08 ID:???] >>378 違う。 if (mkdir ("lock", 755)) { (処理) } こう。 mkdirは、ディレクトリの作成に成功すると真が、 失敗すると偽が返ってくる。
380 名前:nobodyさん [03/05/22 13:35 ID:2b2Zl4vP] >>379 ?それだけでいいんでふか?
381 名前:nobodyさん mailto:a [03/05/22 13:46 ID:???] 20代OLです毎日上司のセクハラや通勤電車での痴漢でストレスがたまっていた そのときにネットで見つけたアダルトDVDショップ以前からオナニー用にDVD が欲しかったのですぐ注文しました、とても安くてびっくりしましたが次の日には もう届きました私が買ったのは、オナニー、レズ、レイプです毎日オナニーしてま す。 www.net-de-dvd.com/
382 名前:nobodyさん mailto:sage [03/05/22 13:53 ID:???] >>380 ttp://homepage1.nifty.com/glass/tom_neko/web/web_04.html このへんでも参考に
383 名前:380 じゃないけど mailto:sage [03/05/22 15:06 ID:???] >>382 激しく参考になりますた。謝謝。 ところで flock() が使えないところで eval{ if(!(flock(FH, 2))){ &function; } }; とした場合ちゃんとサブルチンに逝ってくれますか? false は返ってくるんでしょうか?
384 名前:nobodyさん [03/05/22 15:40 ID:Mzhw6+0o] >>382 サンクスコ(・∀・)
385 名前:nobodyさん [03/05/23 13:24 ID:ORCLTuvq] ロックする時にmkdirでディレクトリを作って、 アンロックする時にrmdirでディレクトリ削除ってことですよね? >>382 のサイト見てないけど…。
386 名前:nobodyさん mailto:sage [03/05/23 13:28 ID:???] >>385 見ろ。
387 名前:山崎渉 mailto:(^^) [03/05/28 17:07 ID:???] ∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉
388 名前:nobodyさん mailto:hage [03/05/28 18:03 ID:???] age
389 名前:nobodyさん [03/05/31 21:04 ID:n0OtuFEQ] ロックされてるかどうか調べるにはどうしたらいい? 他のプロセスでロックしてるファイルにアクセスしてもロックがすぐ終っちゃうような…。 どうすれバインダー。
390 名前:動画直リン [03/05/31 21:10 ID:1EAhrEiJ] homepage.mac.com/hitomi18/
391 名前:nobodyさん mailto:sage [03/05/31 21:44 ID:???] >>389 激しくロックの方法に依ると思うんだが。
392 名前:389 [03/05/31 21:45 ID:n0OtuFEQ] 全般的にできるのはないの?
393 名前:nobodyさん [03/05/31 22:08 ID:nC5SP5sD] >>392 ロック中に sleep 60;
394 名前:nobodyさん mailto:sage [03/05/31 23:30 ID:???] 弱いかな? package FileLock; use IO::File; my $CAT= '/bin/cat'; sub open_w { my $filename= shift; mkdir($filename)unless -d $filename; my $base= sprintf("%s.%s.",time,$$); my $cnt= 0; $cnt++ while(-f "$filename/$base$cnt"); return IO::File->new("$filename/$base$cnt",'>>'); } sub open_r { my $filename= shift; return IO::File->new("|$CAT $filename/*"); } 1;
395 名前:nobodyさん [03/06/01 04:57 ID:Hll/ZLYf] >>393 おぉ!蟻がとう。
396 名前:nobodyさん mailto:sage [03/06/01 12:29 ID:???] >>393 禿げ藁
397 名前:nobodyさん mailto:sage [03/06/01 13:22 ID:???] >>394 駄目ロック。これ使うならロックしなくていい。
398 名前:nobodyさん mailto:sage [03/06/01 21:54 ID:???] アンケートみたいに読み出しが少なくて、書き込みが多いときに flockと組み合わせて(かつcron回してファイルをまとめつつ) 使ってたんだけど。。。駄目かぁ(´Д`;)
399 名前:nobodyさん mailto:sage [03/06/02 00:36 ID:???] >>398 > mkdir($filename)unless -d $filename; 意味なし。複数のプロセスでunless -d $filenameが成立する可能性がある。 排他制御するにはアトミックにやらないと駄目。 排他制御に強い/弱いは無い。正しいか駄目のどちらか一方、わずかでも可能性があれば駄目ロック。
400 名前:nobodyさん [03/06/02 09:59 ID:7y9vki3n] そういえばみんななんで、 --$retry <= 0 なんてやってるの? $retry-- じゃまずいの?
401 名前:nobodyさん [03/06/02 10:09 ID:Ixodm31c] みてね♪ www1.free-city.net/home/s-rf9/page006.html
402 名前:nobodyさん [03/06/02 10:20 ID:sw1UrgM5] ∧_∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ´∀`)/< 先生もろDVDはどこですか? _ / / / \___________ \⊂ノ ̄ ̄ ̄ ̄\ ||\ \ ||\|| ̄ ̄ ̄ ̄ ̄|| || || ̄ ̄ ̄ ̄ ̄|| ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ .|| || (´Д` ) < www.dvd01.hamstar.jp だ! / \ \___________ || || || || __ //_ //___ / // // / /  ̄  ̄ // || ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| || || ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| || || 教卓 || || || ||
403 名前:nobodyさん mailto:sage [03/06/02 10:29 ID:???] >>400 デクリメントの事言ってるのか? 前置きと、後置きでは、動作が違う。 そして、スレ違い。
404 名前:nobodyさん [03/06/02 10:35 ID:azLkJHuz] >>403 いやいや、なんで<=を使ってるかが知りたいの? ifって偽だと実行しないでしょ? $retryは最終的に0になるわけだから、<=は必要ないだろ。 ってかスレ違いって分かってるので、逝ってきます。
405 名前:nobodyさん [03/06/02 10:39 ID:7y9vki3n] 良く見たら答えが分かった。馬鹿か俺。 やっぱり逝くしかないな…。
406 名前:直リン [03/06/02 11:10 ID:mGHfwiJV] homepage.mac.com/yuuka20/
407 名前:nobodyさん mailto:sage [03/06/02 11:20 ID:???] >>404-405 0は偽だが、-1は真になる。 上げてる時点で逝ってください( ̄人 ̄)
408 名前:nobodyさん mailto:sage [03/06/02 11:42 ID:???] >>407 でも絶対-1にはならなくない? まだ逝ってないよ、俺。
409 名前:nobodyさん mailto:sage [03/06/02 12:07 ID:???] >>408 いや・・・だからさ・・・ 全体のソース読んでないんで分からないんだけど。 マイナスになる可能性があるかもしれないんでしょ? --$retry <= 0 この条件だと、$retryがもし0だったら・・・ -1 <= 0 こんな判定になるし。 0が入る訳がないソースだったとしても、 ちゃんと条件書いてる方が、見た目分かりやすいってのもある。 そして、スレ違いだから、やっぱ逝くべき。
410 名前:nobodyさん mailto:sage [03/06/02 12:14 ID:???] >>404 > いやいや、なんで<=を使ってるかが知りたいの? ・・・え? 問い掛けられても・・・
411 名前:nobodyさん mailto:sage [03/06/02 12:16 ID:???] >>408 > でも絶対-1にはならなくない? お前プログラマに向いてない。確実に-1になる。わかったら逝け、わからなくても逝け。
412 名前:nobodyさん [03/06/02 12:47 ID:YkiHze2n] >>411 うおっ!キツイ一言だな…。 でもこのスレのヤシらはなんか優しい…。 すっきりしたら逝くから、すっきりさせろYO! なんで-1になるんだ? 粘着房だな…。
413 名前:nobodyさん mailto:sage [03/06/02 13:02 ID:???] >>412 だから・・・・ --$retry <= 0 ↑これだけ見せられて、-1になるか、ならないかって言われても、 分からない訳なのよ。 どのソースみて、言ってる訳? とにかく、その一行を見る限りでは、-1になる可能性はある。 何度も言うようにスレ違いだから、優しいうちに逝っとけ。
414 名前:動画直リン [03/06/02 13:10 ID:mGHfwiJV] homepage.mac.com/hitomi18/
415 名前:nobodyさん mailto:sage [03/06/02 13:14 ID:???] >>413 そういうことね。 上の方のソースやKENTのソース。 おとなしく逝っときます。 スレ違いのことをしつこくスマンカッタ…。
416 名前:nobodyさん mailto:sage [03/06/02 13:43 ID:???] Cプログラマ的にはif (--retry)の方が早い気がする。 気がするであって、気にする奴が本当に気にしなきゃいけない場合はアセンブラで書く。
417 名前:_ mailto:sage [03/06/02 14:38 ID:???] homepage.mac.com/hiroyuki43/moe/jaz01.html
418 名前:_ mailto:sage [03/06/02 16:09 ID:???] homepage.mac.com/hiroyuki43/moe/jaz01.html
419 名前:_ mailto:sage [03/06/02 19:13 ID:???] homepage.mac.com/hiroyuki43/hankaku/hankaku07.html
420 名前:nobodyさん mailto:sage [03/06/03 08:26 ID:???] >>416 おまえも素質ないから早くプログラマから足洗った方がいいぞ。
421 名前:nobodyさん mailto:sage [03/06/17 05:57 ID:???] search.cpan.org/author/MAKOTO/IO-File-flock-0.07/ これって使っても平気ですか?
422 名前:nobodyさん mailto:sage [03/06/22 16:13 ID:???] 房な質問なんですけど、そんな頻繁にデッドロックって起こるものなんでしょうか?
423 名前:nobodyさん mailto:sage [03/07/07 19:32 ID:???] 10 'ファイルの書き込み 20 Open "Text1.txt" For Output As #1 30 Print #1,"Write file." 40 Close #1 ファイルロックのためのtmpファイル作成しようと思ったんですが、 プログラム内で擬似マルチタスクを作成している時といないときがあるので、 flock関数みたいなものがあれば効率が上がると思うのですが、 やはりrename形の方が安全で軽いのでしょうか?
424 名前:なぞなぞ先生 mailto:sage [03/07/08 06:24 ID:???] 排他処理するために必要な国家資格はなぁんだ?
425 名前:nobodyさん mailto:sage [03/07/08 12:02 ID:???] 情報処理
426 名前:nobodyさん mailto:sage [03/07/08 12:12 ID:???] >>424 歯科医師
427 名前:nobodyさん mailto:sage [03/07/08 12:19 ID:???] 国家公務員一級
428 名前:nobodyさん mailto:sage [03/07/08 15:54 ID:???] シスアドだべ。
429 名前:nobodyさん mailto:sage [03/07/08 15:58 ID:???] 公害防止管理者だろ
430 名前:nobodyさん mailto:sage [03/07/09 00:33 ID:???] >>426 司会者?
431 名前:nobodyさん [03/07/10 16:21 ID:QDkm5VXP] 初心者で申し訳ない。 flock使えるサーバなんだけど、書き込み中はロックするっていう 対象のファイルをflockの引数にするのと、別のダミーファイルを flockの引数にするのとあるでしょ。どっちがいいのでつか。
432 名前:nobodyさん mailto:sage [03/07/10 17:46 ID:???] 場合によるっしょ。 処理全体にかけたいなら後者の方が良いかと。
433 名前:nobodyさん mailto:sage [03/07/10 21:42 ID:???] 先生、Webプログラミング界では共有ロックが理解されていません
434 名前:431 mailto:sage [03/07/10 22:35 ID:???] >>432 ありがとん。 >>433 漏れのこと言ってるようでつね。勉強してきまつ。
435 名前:nobodyさん mailto:sage [03/07/11 11:17 ID:???] そりゃステレオタイプだ
436 名前:nobodyさん mailto:sage [03/07/14 17:20 ID:???] >>424 おまいいい加減教えろ!
437 名前:なぞなぞ先生 mailto:sage [03/07/15 06:43 ID:???] OSやSOFTWAREの基本的なことで申し訳ないのですが、 完全に同時にプロセスが発生することはないよね? マルチタスクってのもマルチスレッドってのも基本的に擬似的に行っているもので、 結局は1つのプロセスが司っている処理って聞いたことがあったような。 そうすると、OSがダウンしない限りrename型の排他処理 rename open 処理 close rename は完璧に有効だと思うんだが。 と思ったけど、それを言い始めたらキリが無いかw うーん、、、しかしたまに2chで1001を超えるのは何でだろう。 ロック解除してから1001のチェックをしているのかな。。。 最近うなされて困ってます。変な文&長文すまん。
438 名前:nobodyさん mailto:sage [03/07/15 06:44 ID:???] いかぁん、名前が残ってた!!! 氏のう。。。。
439 名前:山崎 渉 mailto:(^^) [03/07/15 11:08 ID:???] __∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄
440 名前:nobodyさん mailto:sage [03/07/15 19:03 ID:???] >>437 レスが1000を超えるのはdatファイルへの書き込みと、 レスポンス数のチェック(書き込み禁止処理)がアトミックにできないから。 実際には、二つの処理に結構な間があると思う。
441 名前:nobodyさん mailto:sage [03/07/15 22:40 ID:???] ∩ | | ∧_∧ | | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ´ー`)// < 先生! / / | アトミックって何ですか? / /| / \___________ __| | .| | __ \  ̄ ̄ ̄ ̄ ̄ \ ||\ \ ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄ || || ̄ ̄ ̄ ̄ ̄ ̄ ̄|| .|| ||
442 名前:nobodyさん mailto:sage [03/07/15 23:25 ID:???] 表現がおかしい?(慣れない横文字は使うもんじゃないね 他のプロセスが割り込めない極小時間(ワンステップ)で操作。 にしといてくださいな。
443 名前:nobodyさん mailto:sage [03/07/16 07:27 ID:???] いや、アトミックという言葉は普通に使うと思うぞ ましてやファイルロックの話題ならなおさら
444 名前:437 mailto:sage [03/07/16 08:09 ID:???] その件なのですが、1000のカキコをログに書き込んだら、 ファイルロック中に何らかの処理(たとえば別ファイルにHTML書き出しやHTML化待ちDATリストへの追加) をすれば、"アトミック"は存在しないと思うのですが。 下手な考えスマソ。。。
445 名前:440 mailto:sage [03/07/16 22:09 ID:???] >>444 ああっと、flockが頭にあったので、、 renameが理想的なロックとして動作するとしたら>>437 で可能だと思います。 (OSがlinuxの場合は壊れたりするけど…) 2chとしては、1000で止まらなくても(多少レスが多く付いても)構わないのかも。 (ロックする時間が増える→待ちプロセス数が増える→サーバ負荷が増えるよりは。)
446 名前:437 mailto:sage [03/07/17 00:22 ID:???] >ロックする時間が増える→待ちプロセス数が増える→サーバ負荷が増える 2chみたいな大規模な掲示板だとここが問題なんですね。 ぐっすり眠れそうな気がしました。レスありがとうございました。
447 名前:nobodyさん mailto:sage [03/07/19 14:28 ID:???] 2ch互換スクリプトの場合、スレ立て処理に問題抱えてる場合があるので注意。 スレッドキー(ファイル名)決定と、ファイル作成(書き込み)を別の場所で 行っている事がほとんどなので、同時にスレ立てが発生するとスレッドが 合体する可能性がある。 半年前あたり2chでもちょっと問題になってた。 実際としては2ch以外で問題になることは無いと思うけどね。
448 名前:nobodyさん mailto:sage [03/07/20 07:55 ID:???] >>447 スレアドレス決定とファイル作成を同じスクリプトで行えばオッケー?
449 名前:nobodyさん mailto:sage [03/07/20 09:18 ID:???] >>448 そういうことじゃない。 スクリプトの中でキー決定からファイル作成までの間に いろいろな処理があって、同時スレ立ての一方がファイル作成前に もう一方がそのキーのスレがあるか確認して存在しないと 判断してしまう時差の問題が起こりえるということ。