From: TADA Tadashi Date: 2001-02-26T00:56:38+09:00 Subject: [ruby-list:28267] Re: CGI でのロック (was: File.rename の例外) ただただしです。 On Sun, 25 Feb 2001 01:28:14 +0900 Keisuke Minami wrote: >私の方ではこんな風にやっていますよ。 >#あのページを参考にして >イテレータを使って、ブロックの中に入れるので >ロック解除の処理を書かずにすむのが楽ですね。  前のロックの痕跡が残っている状態で、同時に2つのプロセスが飛び込ん だらまずいような気がするんですがどうでしょう。rescue内のrenameがさら に失敗する場合がありませんか?  私も真似させてもらって、こんな感じに書いてみました。ロックファイル 名には気休めにpidも入れてあります:-) -------------------------- module Lock class LockError < StandardError; end def Lock::lock( basefile = 'lock/lock', try = 10, timeout = 600 ) locking = false lockfile = "#{basefile}.#{Process::pid}.#{Time.now.to_i}" 1.upto( try ) do |time| begin File.rename( basefile, lockfile ) locking = true break rescue #rename failed begin Dir.glob( "#{basefile}.*" ).each do |oldlock| if /^#{basefile}\.\d+\.(\d+)/ =~ oldlock and Time.now.to_i - $1.to_i > timeout then File.rename( oldlock, lockfile ) locking = true break end end rescue end end sleep( 1 ) end raise Lock::LockError, "LockError: #{lockfile} #{$!}" unless locking begin yield ensure File.rename( lockfile, basefile ) if locking end end end --------------------- #るびきちさんの言うように、テストが難しいので完璧じゃないかも。 ■■ Don't Think, Buuuuy. ■■ ■ た だ た だ し ■ ■http://www.spc.gr.jp/sho/ ■