[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/10 00:43 / Filesize : 262 KB / Number-of Response : 974
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【Perl】ファイルロック(排他処理)について語ろう



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
アマちゃんですね。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<262KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef