【Perl】ファイルロック(排他処理)について語ろうat PHP
【Perl】ファイルロック(排他処理)について語ろう - 暇つぶし2ch210:nobodyさん
02/07/29 15:24
>>207
バグもあるけどキミんとこのアクセス数ならOK。

211:nobodyさん
02/07/29 15:36
>>210
どういう意味なんだ?

212:nobodyさん
02/07/29 15:55 yLhb3gGL
どこからダウンロードしたのか忘れたんだけど、
使ってるカウンター(Perl)見たら、

ロックファイル作成

ファイル読み込み

ロックファイル消す

カウントUP

ロックファイル作成

ファイルに書き出し

ロックファイル消す

といった流れになってたんだけど、初めのファイル読み込みの時にもロックは必要なの?


213:nobodyさん
02/07/29 16:25
>>219
とんでもねぇロックの仕方だな

214:nobodyさん
02/07/29 16:27
>>219
はとんでもないロックを出さなければいけない。

215:nobodyさん
02/07/29 16:32
219に期待sage


216:nobodyさん
02/07/29 17:26
>>219 はロッカー♪

217:nobodyさん
02/07/29 17:33
>>219
凄い。そんなアルゴリズムがあったのか。

218:nobodyさん
02/07/29 17:35
>>219ある意味で、とんでもないな。

219: ◆JAPH9PWA
02/07/29 21:21
unless(`ps` =~ /\Q$0\E/)
{
# ロック権を取得したので処理をする
}


220:nobodyさん
02/07/29 22:11
>>219
\Qと\Eの意味知らんけど、確かにとんでもないな

221:nobodyさん
02/07/29 22:13
Windowsでうごかねぇよ。

222:nobodyさん
02/07/29 22:15
他のプロセスを全てkillする排他制御はどうか

223:nobodyさん
02/07/29 22:17
>>222
最強だな、うん

224:nobodyさん
02/07/30 03:13
>>223
なんで最強なんだ? suEXEC ならどうする?

225:nobodyさん
02/07/30 09:03
httpdから何から、「全て」killするからでしょ。root限定で

226:nobodyさん
02/07/30 09:52
そんな真面目に考えなくても


227:nobodyさん
02/07/30 11:37
木村ロック

228:nobodyさん
02/07/31 23:34 EOzgSn6U
書き込み中にタイムアウトになるとログが壊れます?

229:nobodyさん
02/08/01 02:00 DTOpJumx
>>228に便乗
①open直後
②print直後
③close
②、②~③でしょうか?
でもopenでクリティカルな場合に吹っ飛ぶこと考えると…①?

230:nobodyさん
02/08/01 03:58
>>228
サーバの正常なタイムアウトなら、書き込みのシステムコールの
途中で止まったりしないでしょう。数回に分けて書き込んでたら、
止まるけど。サーバの容量制限に引っ掛かって止まる事もあるし。
>229
書き込むときに上書き(>)で開くと内容が消えるので、その直後に
止まったらアウト。

どうしてもログを守るんだったら、かならずtempファイルに書き
出して、書き込み成功を確認した後にrenameすることが必要。
ファイルサイズを計ってサイズが異様に小さいときは失敗だし、
内容をチェックすれば完璧。

これならrenameの瞬間に電源が切れるか、HDDがクラッシュする
くらいの事がなければ、壊れないはず。(バグは除く)
どのみち定期的なバックアップは必要かもね。

231:229
02/08/01 13:35
>>230
thnx
参考になりますた

232:193
02/08/01 19:06 W9oFKOXJ
>>194
だから~。
処理ロックのファイルロックは当然かけておいて、
書き込み時はユニークファイル名に書き出してrename
ってこったよ。

233:nobodyさん
02/08/02 01:01
>>232
アマちゃんですね。

234:nobodyさん
02/08/03 18:57
URLリンク(www.google.co.jp)
>>1-233
この調子でがんばれ糞ども

235:228
02/08/03 20:27 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さん
02/08/03 23:45
>>235
でかいファイルを全部配列に入れるのは大問題だ

237:228
02/08/04 07:59 xc+iopog
>236
50件ずつにログを区切ってるんで
読み込んでるのは
書き込み50件分のデータです
スレッドのタイトル一覧も表示しないといけないし・・・

238:228
02/08/04 08:03 xc+iopog
やっぱ
flockが使えないんでしょうか?
それかtell(DB)の値がおかしくなることがあるのかな?

239:nobodyさん
02/08/04 12:11
>>235
> seek(DB, 0, 0);
> print DB @lines;
> truncate(DB, tell(DB));

先頭にseekした後に、truncate(FH, tell(FH)) したら当然ファイルサイズ0に
なるわけだが。

240:230
02/08/04 12:57
データが大きくないとしても、my @lines=<DB>が失敗してるのかも。
my @lines=<DB> or &error('読み込みエラー');
としてみては?
読み込んだ大きなファイルの方にメモリを食われてるのかもしれず。
システムコール(ここではファイル操作)は常に失敗の可能性を考えて
おいたほうがいいかと。flockやprintもね。

241:nobodyさん
02/08/04 13:14
>>235
もうちょっと問題切り分けた方が良いよ
マルチパートだと思うんだけど、変なモジュールを使って
データ千切れちゃってるとか。
Niftyはflock空振りサーバの代名詞だけど大丈夫?
適当にsleepしてウェイトかけながらテストするとか
シグナル関係全部無視するとか
基本的に共用ならサーバからkillされる様な使い方は
間違ってると思うよ
もし自分のなら、さっさとコネクション切ってじっくりと作業すれば
良いだけなんだけど
サーバのBBSとかFAQは読んでる?

>>239
それは print ~ が有るから問題無い
と言う事で、一応。

242:239
02/08/04 14:38
>>241 正直、スマンカッタ。

243:nobodyさん
02/08/04 15:21
で、なにが最強なの?

244:228
02/08/04 21:59 etatASlj
レスありがとうございます
最初から書いとくべきだったんですが
説明を付け足すと
2chタイプの掲示板なんです
でログファイルへの書き込みはこの部分だけです
カウンターなんかも同じ方法で書き込みしてるんですが
それは飛んだことないんです
で、ログファイルへの書き込みが処理の最後の方なので
遅い回線でファイルアップした時にデータを送るのに
時間がかかり途中でCGIが止まる事があるのかな?
と考えてたのです(最後の方の処理のログファイルが影響受けやすいと)

でも、どういう条件でログが消えるのかは特定できてません
スレッド50件記録のうちの途中(全部じゃないです。例えば36件目とか)で
消えてしまいます(メッセージが途中までしかなかったり)・・・
(レスは別ファイルなのですが、そっちは消えません)

>読み込んだ大きなファイルの方にメモリを食われてるのかもしれず。
そういう制限もあるんですね試してみます
>もうちょっと問題切り分けた方が良いよ
でも、書き込みしてるのこの部分だけなんですよ
やっぱflockが使えなくて
他のプロセスの書き込み中のデータを読み込んでるとログが途中で消えますよね?
でも、カウンターは消えないんですよ・・・
(それともそのうち消えるんでしょうか?ファイルサイズが小さいから確率が低いだけ?)
>サーバのBBSとかFAQは読んでる?
すいません、その辺、勉強してきます

245:nobodyさん
02/08/04 22:48
>>244
一度flock以外のロックで試してみれば?
こういうのが問題を切り分けるって事じゃないのか。

246:230
02/08/05 01:30
データのどこで切れるかが重要。

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 eY1Nkha6
my @lines=<DB> || &error('読み込みエラー');
にしたら
最初の一行しか読まないんですが・・
すいません・・・

248:nobodyさん
02/08/06 01:13
評価順位って知ってる?
(@lines=<DB>)
その他力本願ぶりじゃ先は真っ暗っぽいね

249:228
02/08/06 01:14 HdiBMgeW
or にしたら
ちゃんと動きました
or と || とは違うんですか?
はぁ・・

250:228
02/08/06 01:29 AoKqt/pr
おお、わかりました
ありがとうございます

251:nobodyさん
02/08/06 06:51
>>248
ハァーーーーーーーー


眠たい

252: 
02/08/06 09:00
>>251
何が眠たいんだ? 
my (@lines=<DB>) || &error('読み込みエラー');
で動いてるんだが、向学の為に教えて欲しい

253: ◆JAPH9PWA
02/08/06 09:12
>>249
orは||より優先度がずっと低いんだよ。
だから
@lines = <DB> or error;

(@lines = <DB>) or error;
と評価され、
@lines = <DB> || error;

@lines = (<DB> || error);
と評価される。
||演算子のオペランドはスカラコンテキストで評価されるから、
結果として一行しか読み込まれないことになる、というわけね。

>>252
< my(@lines = <DB>)
> (my(@lines) = <DB>)


254: 
02/08/06 15:22
>>253
優先度を云々するのなら、= と || および = と or について言わないと意味ナイだろ。

255: ◆JAPH9PWA
02/08/07 10:19
>>254
そういえばそうだ。肝心な所が抜けててごめん。

>>253 追記
とりあえず、代入演算子は比較的優先順位が低くなってるんだよ。
例えば、算術演算子や比較演算子などは全て代入演算子より優先度が高い。
だからこそ
$foo = 100 + 200; という式が
($foo = 100) + 200; ではなく、$foo = (100 + 200);と評価される。
で、||や&&といった演算子は代入演算子よりも優先順位が高いため、
加算演算子と同様の評価順序になるってわけ。
しかしながら、orやandといった演算子の優先順位は代入演算子のそれより低いので、
このケースの場合は期待通りに動くわけだね。

詳細についてはついてはperldoc perlopを参照のこと。

256: ◆JAPH9PWA
02/08/07 10:21
ていうかここはファイルロックスレじゃないか!
スレ違いもいいとこだね。とほほ…

257:228
02/08/10 00:33
おかげであれからログが消えてません
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
02/08/10 06:54
>>257
>そのまま使うとエラーでロックを外した瞬間に書き込みが重なってしまう

ロックを外したら、もはやそのプロセスは書き込まないはず。
まさか&errorでexitせずに、実行続けてるとか?

mkdir式が有効なのは、flockがダメだったからかもしれないが、
処理が遅くなるのとタイムアウトがある事で、読み書きが集中
しないようになった効果かもしれない。

質問者は問題が解決しさえすればいいんだが、
flockとmkdir式の併用なんて気持ちわるい結末だなぁ。

259:228
02/08/10 18:58
>ロックを外したら、もはやそのプロセスは書き込まないはず。
どんなエラーでもロックを外してしまうので
書き込み中の人がいて、それ以外の人がエラー出してロックを外してしまう
というのが問題でした
上で書いてるのはちょっと違いました。。

いろいろ教えて頂いたのに、はっきり原因を解明せずに
気持ち悪い結末にしてしまって申し訳ないですが
上のflockのみではprintで失敗したらどうしようもないのなら
mkdirを併用する方法はいいんじゃないかと思うんですが・・

260:230
02/08/10 22:16
>>259
書き込み中の人がいるとしたら、その人しかロックが成功していないので、
それ以外の人がロックを外す事はありえないのが排他制御。
mkdir式の場合、ロック成功したプロセスがエラーで外すなら問題ないわけ。
通常、ロックを成功してないプロセスがロックを外すようなのはバグ。
flockの場合はロックかけたプロセス以外は外せないよ。

> printで失敗したらどうしようもない
mkdirを併用しても同じ状況だけど。
print LOG @lines or &error('書き込みエラー');
でOK。truncateする前にやめればデータは壊れない。

とにかく、mkdir式にするならflockは必要ないので消そうよ。

261:nobodyさん
02/08/11 12:39
結局KENTかよ!!!

262:nobodyさん
02/08/11 12:53
flock使えるならflockにしとけよ!!!

263:nobodyさん
02/08/11 13:45
flockよりKENTが優れていることが証明されました!!!

264:nobodyさん
02/08/11 13:46
どこで?

265:KENT
02/08/11 15:40
flockってカエルだよね?

266: 
02/08/11 15:50
おはロックが有効な鯖ってあるの?

267:nobodyさん
02/08/11 19:41
>>228
だから初めにflock効いてるのか調べてと言ってるのに
空振りしてるんだよ、それ
他のファイル編集部分は時間的にロック無しでも動いてるだけだよ多分

268:nobodyさん
02/08/11 21:39
「多分」って便利な言葉
俺は断言してないよ、忙しかったしよって感じ

269:nobodyさん
02/08/14 01:12
URLリンク(www.kent-web.com)

排他処理とはちょっとズレるかもしれないが、これは立派にシステム上に矛盾が起きてるんだから、"バグ"ではないにしろ、立派な不具合だよな…
この不具合って、そんなに難しいことなのかな…
あたりまえのように、こういうのは想定しないかな?
Kentのスクリプトって、こういうところが馬鹿だよね。


270:nobodyさん
02/08/14 01:45 7AoVgCGe
URLリンク(homepage1.nifty.com)
このまとめてロックっていいんですか?

271:nobodyさん
02/08/14 02:02
>>270
      ,一-、
     / ̄ l |   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ■■-っ < んな こたーない
    ´∀`/    \__________
   __/|Y/\.
 Ё|__ | /  |
     | У..  |

272:nobodyさん
02/08/14 02:05 7AoVgCGe
やっぱだめなんですか

273:nobodyさん
02/08/14 02:14 7AoVgCGe
他にいい方法はありませんか?


274:nobodyさん
02/08/14 04:31
ヅラを強力ロック

275:nobodyさん
02/08/14 20:00 DbQN4DsP
監獄ロック

276:nobodyさん
02/09/14 03:01
慎吾ママの

277:nobodyさん
02/10/01 08:47 OVvB7u9F
URLリンク(kagino110.hp.infoseek.co.jp)
強力なロックだ

278:nobodyさん
02/10/01 14:48
>>277
ううむ、強力すぎてアクセスさえもできないよ!

279:名無しさん@お腹いっぱい。
02/10/01 16:34
>>278
漏れは開きすぎちゃったよ。windows再起動した。
皆気をつけろよ。中のどれか開いたりしたら、国際電話だぞ。



280:名無しさん@お腹いっぱい。
02/10/04 08:00
ム板の「Perlについての質問箱」がruby基地外によって潰されました。
心ある人は、rubyスレにお礼参りしてください。


281:nobodyさん
02/10/08 18:16
>>277
ちょっとワラタ

282:nobodyさん
02/10/11 23:24 0pBUR/gh
read.cgiのファイルロック。これ最強

283:nobodyさん
02/10/12 00:02
>>282
どういうロックやってるの? 知らないから教えてくれ。

284:nobodyさん
02/10/15 14:15
ロックなんかしてないよ
2chの負荷でロックなんかしたら使い物にならん
壊れてたら読み直せばすむことだし

285:nobodyさん
02/10/15 18:19 jOp8uFKz
bbs.cgiはどうやってるの?

286:nobodyさん
02/10/16 11:23
日時とスレッドキーなんかを含めたファイル名で
一時ファイルを作って書き込み終わったら
subject.txtにリネーム
renameのアトミック性に頼ってるわけだな
datはふつうにflockしてるだけ

287:nobodyさん
02/10/22 13:32
わたし 思う。
ロック機能作る。
理論的 このスクリプト完璧。
でも どうテストする。
アルバイト100人雇う。
100人いっせいにアクセスする。
そんな 手間かけられない。 どうする。
2ちゃんねるに晒す。 それ怖い。 どうする。

288:
02/10/22 16:25

・ 実験しないで本番に使う。
・ 覚悟して晒す。
・ 一年生になって友達100人つくる。


289:nobodyさん
02/10/22 16:39
>>287
不覚藁

290:nobodyさん
02/10/22 17:09
>>287
100 スレッド立ててアクセスしまくるにきまっとろーが。

291:nobodyさん
02/10/27 19:23 zFNcoqUs
>>185
別人ですが、読み込んだものを加工してまた書き込む場合には
読み込むときにもロックが必要なんですね?
単に読み込んで、例えば表示したいだけで
加工もしない場合は必要ないんですよね。

292:nobodyさん
02/10/27 21:19
ログ更新中に読み出したらおかしな内容になってしまう。ロックは必要。

293:nobodyさん
02/10/27 22:41
テストスクリプトはlock握って数十秒眠るようにするわけだ。勿論タイムアウト値の調整は必要だ。
そうすりゃ一人でもテストできるだろ。

294:nobodyさん
02/10/28 01:48
>>292
表示がおかしかったら読み直してもらうという
アプローチもありうる(read.cgiとか)。

295:nobodyさん
02/10/29 01:24 3RRgraL5
flockについて、説明として例えば

flock(XX, 2)
書込中だから書込読込ロック、あとから来たら待つ。

とあるのですが、待つってどのくらい待つことが出来るのでしょう…?
上限や目安みたいなものはあるのでしょうか?

296:nobodyさん
02/10/29 01:40
>>295
めっちゃ、待つでぇ

297: ◆hMJAPH9PWA
02/10/29 09:26
>>295
実行者が我慢できなくなってkillするまで、ずっと待つよ。
で、それじゃこまるからってんでブロックしないモードがある。

use Fcntl qw(:flock);

flock FH, LOCK_EX | LOCK_NB or die "ロック失敗:$!";

298:nobodyさん
02/10/29 09:56
もっともブロックしないで無限ループするくらいなら
ブロックして待ったほうがましだが

299:nobodyさん
02/11/03 16:56
大事件発生!

rename を使った完璧なファイルロックが完成してしまいました。

300:nobodyさん
02/11/03 18:41
外出です

301:nobodyさん
02/11/05 18:35 5Ci8Aq1y
んむ・・・。

302:perlお勉強ちゅー
02/11/29 01:12 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お勉強ちゅー
02/11/29 01:54
↑ open の戻り値チェックしてなかった。スマソ

304:私も勉強中
02/11/29 17:19
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
02/11/29 17:25
ごめん、間違えた。
tmpファイルの名前を毎回変えれば大丈夫か。

306:nobodyさん
02/11/29 19:16
>>302
普通に、だめだね。
たとえば、Aプロセスがclose(OUT)まで行く、その直後にBプロセスが
open (IN,"data.txt");、でそのあとAプロセスがrename、Bプロセスは
普通に終了するけど、BのINは、Aが変更を加える前のdata.txtなので
Bがrenameした時点で、Aで加えた変更は破棄される。


307:perlお勉強ちゅー
02/11/30 00:18
>>304 さん >>306 さん
ご解説して下さってありがとうございます。
close しなければ rename できないと勝手に
思い込んでいました。(やってみたらできました)
close したときに flock が解除されるのなら
rename 後に close しとけば別プロセスに割り
込まれることが減り、少しはましになるかな。


308:nobodyさん
02/11/30 15:54
>>307
> rename 後に close
だめ。 AプロセスがINをopen、直後にBがINをopen、Aがflockして処理を
おえる、Bがflockを獲得して処理を終える。これでも、BのINはAが変更を
加える前のdata.txtなので、同様にAの変更が破棄される。

なおかつ、Win環境だとopen中のファイルのrenameはできなかったような?


309:私も勉強中
02/11/30 16:23
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さん
02/12/01 00:55
>>309
flock は、とりあえず >>1 の条件に反するので0点ってとこかな?

311:perlお勉強ちゅー
02/12/01 14:43
>>308
またもやありがとうございます。
rename 後の close を Windows2000 で試したところ、
ご指摘のとおりエラーになりました。

open してから flock するまでに間が空くのがいけないと思い、
今度はフラグを立てるタイプを考えてみましたが、
フラグが立ってるか判別するまでに間が空く・・・
私には解決が難しいので人のソースでもっと勉強してみます。

312:cron
02/12/02 11:25 YojCbNB7
ちょっと教えてほしいんだけど。。

Perlでロックしていてもcronでroot権限でrenameしてしまえるみたいなんだけど
Perlで複数のユーザーがどんどん書き加えていくファイルを何分か置きに
root権限で実行したい場合 問題の起こらない良い方法はありますか?

313:nobodyさん
02/12/02 11:37
>>312
rootで何をしたいのか?

314:cron
02/12/02 13:01 YojCbNB7
rootでしか実行できないコマンドを実行させるのに
そのコマンドのオプションはCGIで書き込ませたいのです。



315:nobodyさん
02/12/02 14:26 Vw2f1Ru9
>>314
ネタだよなぁぁぁぁ、頼むからネタだと言ってくれー

316:cron
02/12/02 15:25 YojCbNB7
なんで?おかしかった?ちゃんと教えてください

317:☆☆☆☆☆
02/12/02 15:47 Z6bI7Cqn
URLリンク(alink3.uic.to)

318:nobodyさん
02/12/02 22:12
オプティミスティック
オプティミスティック
オプティミスティック
ペシミスティック
ペシミスティック
ペシミスティック

あー、言いにくい

319:nobodyさん
02/12/06 00:00
>>316
あのさあ、rootって管理人のことだろ?
どこの鯖缶が赤の他人にroot権限使わせるってのよ。
やるんなら自鯖立ててやんなよ。

320:Perlお勉強ちゅー
02/12/06 01:16
アトミックというのと、入出力の処理全体を包み込むというのが
ファイルの排他処理のキーワードらしいとわかってきました。(つもり)
フラグにするものがアトミックというのは、例えれば、
一組のトランプからはクラブの 1 は 1 枚しか引けないからこそ
目印になるということかな。親元になければ誰もカードを取れないものね。

気になったのは、アトミックがいくつかの使われ方をしている事で、
1 : 現在の ファイル I/O では HDD への読み書きは物理的には一つしかできないことに依存してフラグを立てる。
  (HDD の複数ヘッドがばらばらに動いてたらこわいです。)
2 : Perl 上で処理全体をアトミックにと言う場合は、「読み」「処理」「書き」を
   「1」に依存して、他人(他プロセス)に口をはさませずに行う。
・・・って感じかな。
# 見当違いでしたらつつしんで怒られます。とほ。
# お勉強中途報告でスマソ。

321:cron
02/12/08 07:08 tHo7Ijtw
>>319
root権限で当然、自サバでするんだよ
cronのことしらないの?

322:nobodyさん
02/12/08 08:24
>>321
cronで動かすプログラムとWebプログラムでのファイルのロックが問題なの?
普通のファイルロックと同じようにやればいいじゃん。

323:319
02/12/08 11:44
>>321
自鯖でやるなんて一言も言わなかったじゃないか。
そもそも、自分が鯖缶だとも言ってない。

cronでCGI動かすようにすれば? んで、CGIの方でロックをきちんとすればいい。

324:nobodyさん
02/12/08 11:44
やればいいじゃん。

325:nobodyさん
02/12/08 12:07
>>323
cronでCGI動かすなんてアホな発想はどこから出てくるんだ?

326:nobodyさん
02/12/08 12:11
出てくるんだ?

327:nobodyさん
02/12/08 16:05
お前らいいかげんにネタだと気付け。
> Perlで複数のユーザーがどんどん書き加えていくファイルを何分か置きに
> root権限で実行したい場合 問題の起こらない良い方法はありますか?
「複数のユーザが書き換えるファイル」を「root権限で実行」する馬鹿が本当にいると思ってるのか?

328:山崎渉
03/01/15 13:42
(^^)

329:nobodyさん
03/01/17 10:53 t5G3aPWp
open(ABC "<$hoge") || &error("error");
とかよくやりますが
close(ABC);
閉じるときも
close(ABC) || &error("error");
とやるべきでしょうか?
closeに失敗することあるんでしょうか?

330:nobodyさん
03/01/17 12:29 +SxK8G04
>>329
非常にいい質問だね。
さ、誰か答えてやんなさい。

331:nobodyさん
03/01/17 13:58
while (!close(ABC)) {}

332:nobodyさん
03/01/18 00:49
perl -e 'close(STDIN); close(STDIN) || die $!'
それがどうファイルロックと関係あるのかと

333:nobodyさん
03/01/18 14:04
ファイルロックしている最中にcloseに失敗してエラー処理をせずに
処理が終了されて、ロック解除できずロックファイルが残る場合。

334:nobodyさん
03/01/18 17:36
Apacheのアクセスログなんか尋常じゃないほどの書き込みがあるが
どうして上手くいっているのだろうか?

335:nobodyさん
03/01/18 18:30
>>334
O_APPEND

336:nobodyさん
03/01/18 20:35
>>333
エラー処理の中にバグを入れるのは本末転倒だろうが。

337:nobodyさん
03/01/18 20:51
>>335
ファイルの追加書き込みって上手く使うとflockないシステムでも上手くロックをかけれるかも

338:nobodyさん
03/01/19 23:58
>>337
ロックじゃねーよ。

339:世直し一揆
03/01/30 10:23 EZ4VgkoJ
<血液型A型の一般的な特徴>(見せかけの優しさ・もっともらしさ(偽善)に騙され
るな!)
●とにかく気が小さい(神経質、臆病、二言目には「世間」、了見が狭い)
●他人に異常に干渉し、しかも好戦的・ファイト満々(キモイ、自己中心)
●自尊心が異常に強く、自分が馬鹿にされると怒るくせに平気で他人を馬鹿にしようと
する(ただし、相手を表面的・形式的にしか判断できず(早合点・誤解の名人)、実際に
はたいてい、内面的・実質的に負けている)
●本音は、ものすごく幼稚で倫理意識が異常に低い(人にばれさえしなければOK)
●「常識、常識」と口うるさいが、実はA型の常識はピントがズレまくっている(日本
の常識は世界の非常識)
●権力、強者(警察、暴走族…etc)に弱く、弱者には威張り散らす(強い者に弱く
、弱い者には強い)
●あら探しだけは名人級(例え10の長所があってもほめることをせず、たった1つの短所を見つけてはけなす)
●基本的に悲観主義でマイナス思考に支配されているため性格がうっとうしい(根暗)
●一人では何もできない(群れでしか行動できないヘタレ)
●少数派の異質、異文化を排斥する(差別主義者、狭量)
●集団によるいじめのパイオニア&天才(陰湿&陰険)
●悪口、陰口が大好き(A型が3人寄れば他人の悪口、裏表が激しい)
●他人からどう見られているか、人の目を異常に気にする(「世間体命」、「~みたい
」とよく言う)
●自分の感情をうまく表現できず、コミュニケーション能力に乏しい(同じことを何度
も言ってキモイ)
●表面上意気投合しているようでも、腹は各自バラバラで融通が利かず、頑固(本当は
個性・アク強い)
●人を信じられず、疑い深い(自分自身裏表が激しいため、他人に対してもそう思う)
●自ら好んでストイックな生活をし、ストレスを溜めておきながら、他人に猛烈に嫉妬
する(不合理な馬鹿)
●執念深く、粘着でしつこい(「一生恨みます」タイプ)
●自分に甘く他人に厳しい(自分のことは棚に上げてまず他人を責める。しかも冷酷)
●男は、女々しいあるいは女の腐ったみたいな考えのやつが多い(例:「俺のほうが男
前やのに、なんでや!(あの野郎の足を引っ張ってやる!!)」)

340:nobodyさん
03/01/30 12:26 RKDiglA0
最近運用してるページでロックがよく残る、書き込みファイルがロックしてるにもかかわらず
壊れるという現象が頻発して困ります。
なにか他のいい方法を探しているのですが
書き込み待ちテンプを作るやり方があると聞いたのですが
教えてください。


341:nobodyさん
03/01/30 13:08
>>340
マジレス
お前のロックの仕方が変なだけ

342:nobodyさん
03/01/31 04:05 QdG4FrQH
画像貼り付け掲示板なのですが
どのようにロックかけるのがのぞましいのでしょうか?

343:nobodyさん
03/01/31 07:27 K4VaGHSu
いいサイトだ♪URLリンク(homepage3.nifty.com)

344:nobodyさん
03/01/31 20:55
安全なようにロックをかけるのが望ましい

345:nobodyさん
03/02/01 03:10 6WMjWs0+

                 ∧∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
                (,,゚Д゚)< みんなで視姦汁!
              ./  |   \________
      .______(___/_____
       .|03. 2. 2. / AHE |
       .|________________|
      /\               \
    /    \ 2003年2月2日 \
  / Λ_Λ \   .13:00…   \
/__( ´д`)_\______________\
|       |ゲ.|    │               |
|       |.ロ |    │  梅田丸ビルの  .|
|       |ゲ.|    │  電光掲示板に… .|
|       |.ロ |    │  ..『(゚д゚)ウマー』   |
|γ__  |ゲ.|    │ ̄\       / ̄|
|    \ |.ロ |    │    \_________/    |
|       |ゲ.|    │               │
|____|__||_|)|.ロ |    │ コ ッ プ 1 杯 .│
|□━□ )     │ . ( 約 200ml ) で  |
|  J  |) / ̄ ̄  |. 1 日 分 の * .|
| ∀ ノ < ヒヒヒヒヒ  | 黄色ブドウ状球菌  |
|  - ′ . \____ |   2 分  の 1  |
|  )          │               │
|/.  製 造    ..|               │
| . 逝印大阪工場 . |       500 ml     |
|____________________|______________|

スレリンク(offreg板)l50

346:nobodyさん
03/02/01 03:23
なんだ、騙されたスレじゃないのか

347:nobodyさん
03/02/19 23:23
よくチャックがあけっばなしと言われます

348:山崎渉
03/03/13 17:22
(^^)

349:nobodyさん
03/03/13 22:46
>>329
ログの閉じミスなんて気にしなくても。。。

350:nobodyさん
03/03/22 18:02
どうせさほどアクセスが多いところじゃないんだろうから、mkdirと強制ロック解除のパターンでいいじゃん。

351:nobodyさん
03/04/17 00:56 s+I4ylgd
Perlメモの
URLリンク(www.din.or.jp)
を使おうと思ったんですが、

なにげにperl初心者なんで、その使い方がわかりません。
perlメモには、
$lfh = my_flock() or die 'Busy!';

# アンロックする
my_funlock($lfh);

$lfh にはなにをいれれればいいのでしょう?ファイル名?ファイルハンドル?



352:nobodyさん
03/04/17 02:26
なにも

353:山崎渉
03/04/17 11:58
(^^)

354:351
03/04/17 22:16 PczzXVDV
>>352
どういうこと?

355:佐々木健介
03/04/17 22:16
     ______
    /_      |
    /. \ ̄ ̄ ̄ ̄|
  /  /  ― ― |
  |  /    -  - |
  ||| (5      > |
 | | |     ┏━┓|   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | | |     ┃─┃|  < こんなサイトを見つけた
|| | | |  \ ┃  ┃/    \  正直、スマンカッタ
| || | |    ̄         \_________
URLリンク(freeweb2.kakiko.com)

356:nobodyさん
03/04/17 22:26
>>354
なにげにが気に入らないから教えない

357:bloom
03/04/17 22:56 ahUYqmP+
URLリンク(www2.leverage.jp)

358:nobodyさん
03/04/17 22:57
なんでDB使わないの?

359:あぼーん
03/04/17 23:23
 ( ・∀・)/< こんなのみつけたっち♪ 
URLリンク(www.japan.pinkserver.com)
URLリンク(www.japan.pinkserver.com)
URLリンク(www.japan.pinkserver.com)
URLリンク(www.japan.pinkserver.com)
URLリンク(www.japan.pinkserver.com)
URLリンク(www.japan.pinkserver.com)
URLリンク(www.japan.pinkserver.com)
URLリンク(www.japan.pinkserver.com)
URLリンク(www.japan.pinkserver.com)
URLリンク(www.japan.pinkserver.com)

360:nobodyさん
03/04/18 23:20
>>358
一回使ったらまた集めなきゃならないだろ。

361:nobodyさん
03/04/19 13:00 EJZQKwDz
URLリンク(homepage1.nifty.com)
に載ってる「ファイルを上書きする場合」(↓)
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さん
03/04/19 15:13
>>361
うん、これで問題ないね

363:nobodyさん
03/04/19 19:05
> ★追加:(2)読み込んだデータを加工
この最中に逝っちゃっても大丈夫?

364:nobodyさん
03/04/19 19:45
>>363
途中でプロセスが死んだらどんなことしたって壊れるときは壊れる

365:山崎渉
03/04/20 06:00
   ∧_∧
  (  ^^ )< ぬるぽ(^^)

366::
03/04/21 18:06 J93Hac+3
☆^~^★ 50音順で探せて楽して得する
URLリンク(sagatoku.fc2web.com)
   あなたの探し物きっとみつかるよ☆^~^★


367:nobodyさん
03/04/21 21:46
>>364
駄目じゃん

368:nobodyさん
03/04/21 22:35
>>367
たかが趣味でやってるCGIのデータなんだから気にしすぎ
壊れたらどうやって対処するかスキルを身に付けるいいチャンス

369:nobodyさん
03/04/21 23:09
>>368
そういう誤魔化し方は好きじゃないな

370:nobodyさん
03/04/21 23:33
書いてる途中で死んでもジャーナルファイルシステムの恩恵にあずかれたりしない?

371:nobodyさん
03/04/21 23:54
どんなことしても、壊れる物は壊れる。
イヤなら定期的にバックアップ取る処理を組め。


372:nobodyさん
03/04/22 14:19
突然死するトランザクションは救えないが、DBが壊れないようにすることは可能。

373:nobodyさん
03/04/22 20:26
これだけ粘着的にこだわって、実は IDE で RAID も組んでません、とかいうオチはないよな?

374:nobodyさん
03/04/22 20:41
妥協しないぐらい食材にこだわって、実は化学調味料ドバドバ入れちゃうみたいな?

375:っていうか
03/04/24 13:03
別ファイルに書き込んで mv
これ定説

376:山崎渉
03/05/22 02:08
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―

377:nobodyさん
03/05/22 07:17
厨房な質問で悪いんですが、mkdirを使ったファイルロックってこういうことですか?

if (opendir(LOCK, "lock")) {
  closedir(LOCK);

  rmdir("lock");

  # 処理

  mkdir("lock");
}

378:nobodyさん
03/05/22 09:34 sAd9/kNT
mkdir("lock")
じゃなくて
mkdir("lock", 600)
でした。

379:nobodyさん
03/05/22 10:08
>>378
違う。
if (mkdir ("lock", 755)) {
  (処理)
}

こう。
mkdirは、ディレクトリの作成に成功すると真が、
失敗すると偽が返ってくる。


380:nobodyさん
03/05/22 13:35 2b2Zl4vP
>>379
?それだけでいいんでふか?

381:nobodyさん
03/05/22 13:46
20代OLです毎日上司のセクハラや通勤電車での痴漢でストレスがたまっていた
そのときにネットで見つけたアダルトDVDショップ以前からオナニー用にDVD
が欲しかったのですぐ注文しました、とても安くてびっくりしましたが次の日には
もう届きました私が買ったのは、オナニー、レズ、レイプです毎日オナニーしてま
す。
URLリンク(www.net-de-dvd.com)


382:nobodyさん
03/05/22 13:53
>>380
URLリンク(homepage1.nifty.com)
このへんでも参考に

383:380 じゃないけど
03/05/22 15:06
>>382
激しく参考になりますた。謝謝。

ところで
flock() が使えないところで

eval{ if(!(flock(FH, 2))){ &function; } };

とした場合ちゃんとサブルチンに逝ってくれますか?
false は返ってくるんでしょうか?


384:nobodyさん
03/05/22 15:40 Mzhw6+0o
>>382
サンクスコ(・∀・)

385:nobodyさん
03/05/23 13:24 ORCLTuvq
ロックする時にmkdirでディレクトリを作って、
アンロックする時にrmdirでディレクトリ削除ってことですよね?

>>382のサイト見てないけど…。

386:nobodyさん
03/05/23 13:28
>>385
見ろ。

387:山崎渉
03/05/28 17:07
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎―◎                      山崎渉

388:nobodyさん
03/05/28 18:03
age

389:nobodyさん
03/05/31 21:04 n0OtuFEQ
ロックされてるかどうか調べるにはどうしたらいい?
他のプロセスでロックしてるファイルにアクセスしてもロックがすぐ終っちゃうような…。

どうすれバインダー。

390:動画直リン
03/05/31 21:10 1EAhrEiJ
URLリンク(homepage.mac.com)

391:nobodyさん
03/05/31 21:44
>>389
激しくロックの方法に依ると思うんだが。

392:389
03/05/31 21:45 n0OtuFEQ
全般的にできるのはないの?

393:nobodyさん
03/05/31 22:08 nC5SP5sD
>>392
ロック中に
sleep 60;


394:nobodyさん
03/05/31 23:30
弱いかな?
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 Hll/ZLYf
>>393
おぉ!蟻がとう。

396:nobodyさん
03/06/01 12:29
>>393
禿げ藁

397:nobodyさん
03/06/01 13:22
>>394
駄目ロック。これ使うならロックしなくていい。

398:nobodyさん
03/06/01 21:54
アンケートみたいに読み出しが少なくて、書き込みが多いときに
flockと組み合わせて(かつcron回してファイルをまとめつつ)
使ってたんだけど。。。駄目かぁ(´Д`;)


399:nobodyさん
03/06/02 00:36
>>398
> mkdir($filename)unless -d $filename;
意味なし。複数のプロセスでunless -d $filenameが成立する可能性がある。
排他制御するにはアトミックにやらないと駄目。

排他制御に強い/弱いは無い。正しいか駄目のどちらか一方、わずかでも可能性があれば駄目ロック。

400:nobodyさん
03/06/02 09:59 7y9vki3n
そういえばみんななんで、
--$retry <= 0
なんてやってるの?
$retry--
じゃまずいの?

401:nobodyさん
03/06/02 10:09 Ixodm31c
みてね♪
URLリンク(www1.free-city.net)

402:nobodyさん
03/06/02 10:20 sw1UrgM5
               ∧_∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
              ( ´∀`)/< 先生もろDVDはどこですか?
           _ / /   /   \___________
          \⊂ノ ̄ ̄ ̄ ̄\
           ||\        \
           ||\|| ̄ ̄ ̄ ̄ ̄||                
           ||  || ̄ ̄ ̄ ̄ ̄||         ∧_∧    / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  
              .||          ||         (´Д` )  <  URLリンク(www.dvd01.hamstar.jp) だ!
                              /   \   \___________
                              ||  ||  
                              ||  ||
                         __ //_ //___
                        /  //  //      /
                       /    ̄     ̄      //
                       || ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||  ||
                       || ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||  ||
                       ||    教卓         ||  ||
                       ||                ||




403:nobodyさん
03/06/02 10:29
>>400
デクリメントの事言ってるのか?
前置きと、後置きでは、動作が違う。
そして、スレ違い。


404:nobodyさん
03/06/02 10:35 azLkJHuz
>>403
いやいや、なんで<=を使ってるかが知りたいの?
ifって偽だと実行しないでしょ?
$retryは最終的に0になるわけだから、<=は必要ないだろ。

ってかスレ違いって分かってるので、逝ってきます。

405:nobodyさん
03/06/02 10:39 7y9vki3n
良く見たら答えが分かった。馬鹿か俺。

やっぱり逝くしかないな…。

406:直リン
03/06/02 11:10 mGHfwiJV
URLリンク(homepage.mac.com)

407:nobodyさん
03/06/02 11:20
>>404-405
0は偽だが、-1は真になる。

上げてる時点で逝ってください( ̄人 ̄)


408:nobodyさん
03/06/02 11:42
>>407
でも絶対-1にはならなくない?

まだ逝ってないよ、俺。

409:nobodyさん
03/06/02 12:07
>>408
いや・・・だからさ・・・
全体のソース読んでないんで分からないんだけど。
マイナスになる可能性があるかもしれないんでしょ?

--$retry <= 0

この条件だと、$retryがもし0だったら・・・
-1 <= 0
こんな判定になるし。
0が入る訳がないソースだったとしても、
ちゃんと条件書いてる方が、見た目分かりやすいってのもある。
そして、スレ違いだから、やっぱ逝くべき。


410:nobodyさん
03/06/02 12:14
>>404
> いやいや、なんで<=を使ってるかが知りたいの?
・・・え? 問い掛けられても・・・


411:nobodyさん
03/06/02 12:16
>>408
> でも絶対-1にはならなくない?
お前プログラマに向いてない。確実に-1になる。わかったら逝け、わからなくても逝け。

412:nobodyさん
03/06/02 12:47 YkiHze2n
>>411
うおっ!キツイ一言だな…。
でもこのスレのヤシらはなんか優しい…。

すっきりしたら逝くから、すっきりさせろYO!

なんで-1になるんだ?
粘着房だな…。

413:nobodyさん
03/06/02 13:02
>>412
だから・・・・

--$retry <= 0

↑これだけ見せられて、-1になるか、ならないかって言われても、
分からない訳なのよ。
どのソースみて、言ってる訳?

とにかく、その一行を見る限りでは、-1になる可能性はある。
何度も言うようにスレ違いだから、優しいうちに逝っとけ。


414:動画直リン
03/06/02 13:10 mGHfwiJV
URLリンク(homepage.mac.com)

415:nobodyさん
03/06/02 13:14
>>413
そういうことね。
上の方のソースやKENTのソース。

おとなしく逝っときます。
スレ違いのことをしつこくスマンカッタ…。

416:nobodyさん
03/06/02 13:43
Cプログラマ的にはif (--retry)の方が早い気がする。
気がするであって、気にする奴が本当に気にしなきゃいけない場合はアセンブラで書く。

417:_
03/06/02 14:38
URLリンク(homepage.mac.com)

418:_
03/06/02 16:09
URLリンク(homepage.mac.com)

419:_
03/06/02 19:13
URLリンク(homepage.mac.com)

420:nobodyさん
03/06/03 08:26
>>416
おまえも素質ないから早くプログラマから足洗った方がいいぞ。

421:nobodyさん
03/06/17 05:57
URLリンク(search.cpan.org)
これって使っても平気ですか?


422:nobodyさん
03/06/22 16:13
房な質問なんですけど、そんな頻繁にデッドロックって起こるものなんでしょうか?

423:nobodyさん
03/07/07 19:32
10 'ファイルの書き込み
20 Open "Text1.txt" For Output As #1
30 Print #1,"Write file."
40 Close #1

ファイルロックのためのtmpファイル作成しようと思ったんですが、
プログラム内で擬似マルチタスクを作成している時といないときがあるので、
flock関数みたいなものがあれば効率が上がると思うのですが、
やはりrename形の方が安全で軽いのでしょうか?

424:なぞなぞ先生
03/07/08 06:24
排他処理するために必要な国家資格はなぁんだ?

425:nobodyさん
03/07/08 12:02
情報処理

426:nobodyさん
03/07/08 12:12
>>424
歯科医師

427:nobodyさん
03/07/08 12:19
国家公務員一級


428:nobodyさん
03/07/08 15:54
シスアドだべ。

429:nobodyさん
03/07/08 15:58
公害防止管理者だろ

430:nobodyさん
03/07/09 00:33
>>426
司会者?

431:nobodyさん
03/07/10 16:21 QDkm5VXP
初心者で申し訳ない。
flock使えるサーバなんだけど、書き込み中はロックするっていう
対象のファイルをflockの引数にするのと、別のダミーファイルを
flockの引数にするのとあるでしょ。どっちがいいのでつか。




432:nobodyさん
03/07/10 17:46
場合によるっしょ。
処理全体にかけたいなら後者の方が良いかと。

433:nobodyさん
03/07/10 21:42
先生、Webプログラミング界では共有ロックが理解されていません

434:431
03/07/10 22:35
>>432
ありがとん。
>>433
漏れのこと言ってるようでつね。勉強してきまつ。


435:nobodyさん
03/07/11 11:17
そりゃステレオタイプだ

436:nobodyさん
03/07/14 17:20
>>424
おまいいい加減教えろ!

437:なぞなぞ先生
03/07/15 06:43
OSやSOFTWAREの基本的なことで申し訳ないのですが、
完全に同時にプロセスが発生することはないよね?
マルチタスクってのもマルチスレッドってのも基本的に擬似的に行っているもので、
結局は1つのプロセスが司っている処理って聞いたことがあったような。
そうすると、OSがダウンしない限りrename型の排他処理
rename
open
処理
close
rename
は完璧に有効だと思うんだが。
と思ったけど、それを言い始めたらキリが無いかw

うーん、、、しかしたまに2chで1001を超えるのは何でだろう。
ロック解除してから1001のチェックをしているのかな。。。

最近うなされて困ってます。変な文&長文すまん。

438:nobodyさん
03/07/15 06:44
いかぁん、名前が残ってた!!!

氏のう。。。。

439:山崎 渉
03/07/15 11:08

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄

440:nobodyさん
03/07/15 19:03
>>437
レスが1000を超えるのはdatファイルへの書き込みと、
レスポンス数のチェック(書き込み禁止処理)がアトミックにできないから。

実際には、二つの処理に結構な間があると思う。

441:nobodyさん
03/07/15 22:40
              ∩
             | |
       ∧_∧  | |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
      ( ´ー`)//  < 先生!
      /     /    | アトミックって何ですか?
     / /|    /     \___________
  __| | .|    | __
  \   ̄ ̄ ̄ ̄ ̄   \
  ||\            \
  ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
  ||  || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
     .||              || 


442:nobodyさん
03/07/15 23:25
表現がおかしい?(慣れない横文字は使うもんじゃないね

他のプロセスが割り込めない極小時間(ワンステップ)で操作。
にしといてくださいな。


443:nobodyさん
03/07/16 07:27
いや、アトミックという言葉は普通に使うと思うぞ
ましてやファイルロックの話題ならなおさら

444:437
03/07/16 08:09
その件なのですが、1000のカキコをログに書き込んだら、
ファイルロック中に何らかの処理(たとえば別ファイルにHTML書き出しやHTML化待ちDATリストへの追加)
をすれば、"アトミック"は存在しないと思うのですが。

下手な考えスマソ。。。

445:440
03/07/16 22:09
>>444
ああっと、flockが頭にあったので、、
renameが理想的なロックとして動作するとしたら>>437で可能だと思います。
(OSがlinuxの場合は壊れたりするけど…)

2chとしては、1000で止まらなくても(多少レスが多く付いても)構わないのかも。
(ロックする時間が増える→待ちプロセス数が増える→サーバ負荷が増えるよりは。)

446:437
03/07/17 00:22
>ロックする時間が増える→待ちプロセス数が増える→サーバ負荷が増える
2chみたいな大規模な掲示板だとここが問題なんですね。
ぐっすり眠れそうな気がしました。レスありがとうございました。

447:nobodyさん
03/07/19 14:28
2ch互換スクリプトの場合、スレ立て処理に問題抱えてる場合があるので注意。
スレッドキー(ファイル名)決定と、ファイル作成(書き込み)を別の場所で
行っている事がほとんどなので、同時にスレ立てが発生するとスレッドが
合体する可能性がある。

半年前あたり2chでもちょっと問題になってた。
実際としては2ch以外で問題になることは無いと思うけどね。

448:nobodyさん
03/07/20 07:55
>>447
スレアドレス決定とファイル作成を同じスクリプトで行えばオッケー?

449:nobodyさん
03/07/20 09:18
>>448
そういうことじゃない。
スクリプトの中でキー決定からファイル作成までの間に
いろいろな処理があって、同時スレ立ての一方がファイル作成前に
もう一方がそのキーのスレがあるか確認して存在しないと
判断してしまう時差の問題が起こりえるということ。

450:nobodyさん
03/07/26 13:13 GHzBAdl/
flock のロックをしたいんですが、
具体的に何をすれば良いのでしょうか?
flock と言う名前のディレクトリを
作って、ロックしたいファイルに
置いとけば良いのでしょうか?
すいませんが、まるっきりの初心者ですので、
教えて下さい。

451:nobodyさん
03/07/26 13:24
>>450
>>1-449

452:nobodyさん
03/07/26 13:55
>>451
ワロタ!
でも、イイ!

453:_
03/07/26 13:55
URLリンク(homepage.mac.com)

454:nobodyさん
03/07/26 18:00
YOU THE☆ROCKは綴りが違いますが、このスレの親戚ですか?

flockするファイルのあるディレクトリのパーミッションは任意たんでよいですか?
自分の中で最高の条件を満たすレンタル鯖がflock使えないとかなりへこむ。。。
結局rename型のlockにしてみたんだが、鯖の負荷とか考えたくないなぁ。

ブロードバンド回線開通したら絶対鯖立てたい。

と言う独り言でした。また来週。

455:nobodyさん
03/07/26 22:03
やっぱりファイルで何らかのロック処理をした後、
flockも使うのが最強ですかね?

456:nobodyさん
03/07/26 22:40
じっさまなら誰もおこらねぇけど、

457:nobodyさん
03/07/27 01:31
>>455
ハァ、Webプログラマーってどうして馬鹿ばっか集まるんだ。
排他制御に強い/弱いはない。正しい/駄目のどちらかだ。
駄目なものをいくつ重ねても駄目なものは駄目。正しい方法を複数使う必要はない。

458:nobodyさん
03/07/27 03:14
結論が出てしまったな・・・

459:nobodyさん
03/07/27 09:30
ドコ━━(゚Д゚≡(゚Д゚≡゚Д゚)≡゚Д゚)━━!!!!???

460:nobodyさん
03/07/27 20:51
Iriaにセキュリティーホールらしいぞ。
スレリンク(geino板:377番)


461:nobodyさん
03/08/04 22:07
今の今までflockできないとおもってたが、パーミッション777で解決しちった。

462:nobodyさん
03/08/06 01:55 pOGj2Sy2
てす

463:nobodyさん
03/08/06 01:56 pOGj2Sy2
てすてす

464:nobodyさん
03/08/06 01:56 pOGj2Sy2


465:nobodyさん
03/08/07 14:03 fxtSTKIN
ちょっと思った。
use Fcntl;
をしといて、
sysopen
を使ってLOCK_EXとか呼べないかな。

466:nobodyさん
03/08/07 14:18
意味不明。
LOCK_EXは定数(を返すだけのsub)

467:nobodyさん
03/08/07 15:00
use Fcntl;
sysopen FILE,"hoge",O_RDWR|O_CREAT|LOCK_EX;
みたいなことできるかってこと?
試してみてね。
俺は知らん。

468:nobodyさん
03/08/08 01:36
>>465
use Fcntl;するならO_SHLOCKとO_EXLOCKが使えるでしょ。
Win系はシラネ。

469:nobodyさん
03/08/08 04:05
>>465
うん、使える。
O_EXLOCKを使ってsysopenで書いてあげたら
もっとスマートなlockができそう。

470:nobodyさん
03/08/09 22:15
>>465
use IO::File::fock;
my $fh = new IO::File::fock('file','>>');


471:山崎 渉
03/08/15 22:42
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン

472:nobodyさん
03/08/24 11:20
flock使えます。
追記の場合って、どうするのが一番確実で負荷がかかんないんでしょうか?
僕は、データを編集する場合と同じように、以下のようにしちゃってますが。use Fcntl qw(:flock);
#万が一リネーム失敗したときのために、ユニークなファイル名にしておく
$tmpfile = "$datafile".".$$.". time() .".csv";
#ロックファイルを作成する(★注:ロックファイルは、各CSVごとにユニークに)
open (LOCKF, ">$datafile"."_lockf") or die("cannot open:$!");
    flock (LOCKF, LOCK_EX);    #ロックファイルをflockする
    open(IN, "< $datafile") or die("cannot open:$!"); # 読みのみモードで開く
        open(TMP,"> $tmpfile"); #テンポラリファイルを作成
            while ($line = <IN>){
                $line .= <IN> while ($line =~ tr/"// % 2 and !eof(IN));
                $line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
                @values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_}
                 ($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
                #必要なものだけをEUCにして、出力時にSJISにする
                foreach $value (@values){
                    &jcode::convert(\$value, "euc");
                };
                #CSV形式に変換
                $newline = join ',', map {(s/"/""/g or /[\r\n,]/) ? qq("$_") : $_} @values;
                print TMP "$newline\n" ;#テンポラリファイルに1レコード書き込み
            }
            print TMP "新しい行" . "\n";
        close TMP;
    close IN;
    unlink $datafile;
    rename ($tmpfile, $datafile) or die ("cannot rename : $!");
close LOCKF;


473:472
03/08/24 11:25 xfHM1yWk
あ、よく考えたら、既存の行をいちいち@valuesにする必要はないんだ・・・
訂正。
↓これでどうでしょか?

use Fcntl qw(:flock);
#万が一リネーム失敗したときのために、ユニークなファイル名にしておく
$tmpfile = "$datafile".".$$.". time() .".csv";
#ロックファイルを作成する(★注:ロックファイルは、各CSVごとにユニークに)
open (LOCKF, ">$datafile"."_lockf") or die("cannot open:$!");
    flock (LOCKF, LOCK_EX);    #ロックファイルをflockする
    open(IN, "< $datafile") or die("cannot open:$!"); # 読みのみモードで開く
        open(TMP,"> $tmpfile"); #テンポラリファイルを作成
            while ($line = <IN>){
                print TMP $line ;
            }
            print TMP "新しい行" . "\n";
        close TMP;
    close IN;
    unlink $datafile;
    rename ($tmpfile, $datafile) or die ("cannot rename : $!");
close LOCKF;



474:472
03/08/24 11:57 xfHM1yWk
あるいはもう1つの選択枝。
単純に、

use Fcntl qw(:flock);
open(OUT, "+< $datafile");
    flock (LOCKF, LOCK_EX);
        truncate(OUT, 0);          # ファイルサイズを0バイトにする
        seek(OUT, 0, 0);            # ファイルポインタを先頭にセット
        print OUT "新しい行" . "\n";;  # 書き込む
close(OUT);                     # closeすれば自動でロック解除

・・・・どっちがいいのでしょうか・・・?

475:nobodyさん
03/08/24 12:53
>>474
追記なら

use Fcntl qw(:flock);
open(OUT, ">>$datafile");
    flock (OUT, LOCK_EX);
        seek(OUT, 0, 2);           # ファイルポインタを最後尾にセット(念のため)
        print OUT "新しい行" . "\n";;  # 書き込む
close(OUT);                     # closeすれば自動でロック解除

--
# 私はこんな感じ(Win不可)
use FileHnadle;
my $fh = new FileHandle($datafile, O_WRONLY|O_CREAT|O_APPEND|O_EXLOCK) or die;
print $fh '新しい行', "\n";
close($fh);

IO::Fileでもいいんだけど、趣味でFileHandle使ってます。

476:nobodyさん
03/08/27 11:26
某K氏のアクセス解析でFlock使うようにしようとしたのですが

open(LOG, ">$logfile") or &error("Open Error : $logfile");
flock(LOG, 2);
seek(LOG, 0, 2);
my(@lines) = <LOG>;

(if($agent =~ /MSIE 3/i) { $agent = 'MSIE 3'; }のような置換とか)

while($max-1 < @lines) { pop(@lines); }
unshift(@lines, "$agent<>$os<>$host<>$referer<>$hour<>$doc_uri<>\n");
unshift(@lines, "$addr\n");

print LOG @lines;
close(LOG);

こうすると書き込み時にログが一旦全部消えてしまい、
取得した最後のログ一行(先頭行に最終アクセスIPがあるので正確には二行)のみになってしまいます。
何処が悪いのでしょうか…

因みに元スクリプトではログを配列に読み込んだ時点で一旦閉じ、
処理後もう一度開いて書き込みという風になってたのですが、
これだと処理中に書き込まれたら駄目そうな気がしたので上のように書き換えたのです。


477:nobodyさん
03/08/27 19:09
>>476
lockどうこうより、while がおかしいのでは?
$max-1 < @lines がどういう比較かわからんけど、自分で
pop(@lines);して削除しちゃってるじゃないの
常にwhileが真で全行削除になってその後unshiftで2行追加してるだけでは?

478:nobodyさん
03/08/27 21:08
>open(LOG, ">$logfile") or &error("Open Error : $logfile");
'>'でオープンすると?
・ファイルの中身を切り詰める。
・書き込み専用でオープンする(ファイルが無ければ作成)。

>seek(LOG, 0, 2);
この意味は?
・フィル最後尾にファイルハンドルを移動する。

さすがに読めません。

479:nobodyさん
03/08/27 21:09
open(LOG, "+<$logfile") or &error("Open Error : $logfile");
flock(LOG, 2);
my (@lines) = <LOG>;

(ロックスレなので、、略)

seek(LOG, 0, 0);
truncate(LOG, 0);
print LOG @lines;
close(LOG);

上の書き方では、seekとtruncateの間で終了させられると、
ファイルの中身が失う危険性があるから、

seek(LOG, 0, 0);
print LOG @lines;
truncate(LOG, ftell(LOG));
close(LOG);

と書くといいらしいです。(実際はどうなんでしょ?)

URLリンク(www.kt.rim.or.jp)
URLリンク(www.kt.rim.or.jp)
クックブック 7.11
URLリンク(homepage1.nifty.com)

480:479
03/08/27 22:53
>truncate(LOG, ftell(LOG));
間違いでした。以下の通り。
truncate(LOG, tell(LOG));

481:nobodyさん
03/08/28 11:06
ログだったら、追記で開いて、flockしてファイルの尻seekするだけじゃ
だめなの?

482:nobodyさん
03/08/31 01:47 3rubdTEF
あるサイトでみたんだけど、
use DB_File;
use Fcntl;
open DAT,"lockfile";
flock(DAT,LOCK_EX);
tie(%hash,'DB_File',"dbfile",O_RDWR|O_CREAT,0666
---DBM代入処理
としてロックしてました。
lockfileというファイルへの排他ロックを取得しているのは
わかるんだけど、それがどうしてDBMのdbfileへのロックと
なるのかわからん。

483:nobodyさん
03/08/31 04:22
>>482
「dbfileを使うプロセスは、かならずdbfileにアクセスする前にlockfileをロックする」
という紳士協定があればうまく行く。

dbfileにアクセスするのが>>482のスクリプトだけの場合も然り。

それでもなぜか分からないなら良く考えてみ。

484:nobodyさん
03/08/31 20:24
>>482
ブロッキングを理解すると分かると思います。

flockでロックされると、LOCK_NBを指定していない限り、
排他される側はflock関数の場所で処理を止められます。

485:482
03/08/31 22:31 3rubdTEF
tieする前に必ずファイルロック処理する。
flockをLOCK_SHでした場合は%hashへの代入はしない。
上を全てのdbfileを使う処理でする。
この順番を守ればflockの段階でブロックしてtieへ進まない。
やっと、すっきりした。
>>483.484さんありがとー

486:nobodyさん
03/08/31 23:56
ついでですが、ファイルを排他ロック(LOCK_EX)するときは、
書き込みできる状態でファイルをオープンしないとロックしない
OSがあるそうです。ご注意あれ。

参考:
同じ(ような)処理をするモジュール。
URLリンク(search.cpan.org)

487:482
03/09/01 01:40
>>486
open LOCK,'<lockfile';
ってするてことですね。気をつけます。
このモジュール結構便利ですね。
ありがとございます。
perlの面白みにはまっっていく・・土日外にでてねえ・・

488:nobodyさん
03/09/01 19:13
LOCK_SHしといて、STORE~SYNCまでの間LOCK_EXにして
SYNCがかかったらSHにもどしちゃダメ?
LOCK_EXの時間は短い方がいいとおもうんだけど

489:nobodyさん
03/09/01 22:19
>>488
魅力的ですが、共有ロック(LOCK_SH)をしているところに
排他ロック(LOCK_EX)をしようとすると、
ブロックされて待たされることになります。

書き込む事がほとんどないのであれば、
検討する価値はあるかも。

ロックしたら、操作、すぐ開放が基本です。

490:488
03/09/02 11:52
> 魅力的ですが、共有ロック(LOCK_SH)をしているところに
> 排他ロック(LOCK_EX)をしようとすると、
> ブロックされて待たされることになります。
同じプロセスならLOCK_SHからLOCK_EXへ移行できちゃったんですが...


491:nobodyさん
03/09/02 20:13
言いたかったのは、こんなイメージです。

 processA     processB
   |         |
flock(F, LOCK_SH);   |
   |         |
  処理    flock(F, LOCK_EX);
   |          :
   |          :  (ブロックされる)
   |          :
 close(F);       処理 (ここで処理開始)
   |         |
   exit;        |
            close(F);
              |
             exit;

492:490
03/09/04 22:14
そっか、タイミングがちょっと遅くなるだけで、結局待たされるんだ。。。
って事でURLリンク(www.perldoc.jp)をみると・・・
まともにロックしたかったらBerkeleyDBを使えっと(´Д`;)



493:nobodyさん
03/09/06 01:39 A9Khhwgn
flockでここまでスレが伸びるのか・・・。
漏れなら小規模の場合は消えるの覚悟で単純にflockだけ(面倒)。
中規模以上はDB立ててDBのLOCKで対処。

これじゃいかんのか?

494:nobodyさん
03/09/06 02:09
俺もDBマンセー

495:nobodyさん
03/09/06 03:10
>>493
flockで消えちゃうのは、何かお前のやり方に問題があるんだと思うぞ。
システム自体がflockの堅牢性に頼っていると言うのに。

496:nobodyさん
03/09/07 02:25
flockにも限界があるので、できるなら餅は餅屋に任せるのがいいと思いますよ。

497:nobodyさん
03/09/07 10:06
>>496
限界って?
Windowsやover networkでうまく働かない以外に何か問題あったっけ?

だいたいflock使えねーとか言ってるヤツのコードみると書き方間違ってる
だけだったりするんだよな。

ごちゃごちゃ言う前にモジュール使えってのはまぁ同意だけど。

498:nobodyさん
03/09/07 14:44 AN0xO5Ef
>Windowsやover networkでうまく働かない以外に何か問題あったっけ?

ありますよ。ご自分でお調べください。

499:nobodyさん
03/09/07 15:01
>>498
あとは昔のOSでバッファをフラッシュしないくらいしか思いつかないなあ。

UN*X系のOSで別に正しく使えばファイルが消えちゃうとかはないでしょ?

500:nobodyさん
03/09/07 15:03
UNIX系でflockに対応してないものもある、見たいなのを読んだ事があるけど本当ですかね?

501:nobodyさん
03/09/07 15:04
>>499
>>496=498は適当に言ってるだけですよ。

502:nobodyさん
03/09/07 15:14
そんな感じだな

503:496
03/09/07 19:04
>>497
flockでデータベースを丸ごとロックするより、
他の方法を使ったほうが限界性能が上がると言いたかったのですが…。

別の話として。
>Windowsやover networkでうまく働かない以外に何か問題あったっけ?
ActivePerlの場合、WIN32APIのLockFileEXが使えれば、Windowsでも使えます。
そして、それはうまく働きます。

私はflock(2)の信頼性を否定しません。
とはいえ、perlのflockについてはperldocに例外事項が書かれています。
(498さんの言いたかったのはこれかな)

perlのflock関数 = flock(2)であるとは限りません。

参考:
perldoc -f flcok
perlソース pp_sync.c
ActivePerlソース win32.c

504:nobodyさん
03/09/07 22:04
>>503
おいおい、何はぐらかしてんだ?
>Windowsやover networkでうまく働かない以外に何か問題あったっけ?

>他の方法を使ったほうが限界性能が上がると言いたかったのですが…。
他の方法とは?

505:nobodyさん
03/09/07 22:26 K46D6zau
flockからunlockまでの途中で強引に処理を止めて、同じcgiを複数
起動させればflockの信頼性が判るよ。いくつかはロックかからずに
スルーされるからさ。

後はロックの残骸による次プロセス(同一ロック)の停止かな。
遠回りしないと解決出来ないのは面倒。

漏れが間違っているかもしれんが、同時に数千~数万単位でロックを
必要とする環境に置いて上記の理由からflockは使いたくないです。
よってほとんどDBのロックに任せっきり。DBだと単純なa=a+1の場合だと
DB自体が保証してるんでロック不必要だし。

間違っていたら本当にスマソ。業務でロックを故意に壊しにいった結果
こうなったので。

506:nobodyさん
03/09/07 22:35
>>505
ソースとdfの結果みせてみな。

そういうケースの殆どはファイルシステムがNFSだった、って
オチな訳だが。

もし本当にflock(2)に信頼性がないなら、sendmailがmailboxファイルを消しまくる
現象が世界中で起きてるはずだが。

> 後はロックの残骸による次プロセス(同一ロック)の停止かな。

・・・は?

> 間違っていたら本当にスマソ。

多分間違ってると思う。

507:nobodyさん
03/09/07 23:19
>>505
>いくつかはロックかからずにスルーされるからさ。
どうやって判断してんだ。テストコードがバグってんだろ。よくあることだ。

>ロックの残骸
って何?

>flockは使いたくないです。
>よってほとんどDBのロックに任せっきり
・・・

508:nobodyさん
03/09/07 23:54
最近は、凧や独楽を買ったものの、子供がうまく使いこなせずに「不良品じゃないのか!」と
店に怒鳴り込む馬鹿親がいると聞きますが・・・。

この業界にも、道具を使いこなす努力をせずに、自分の無能を全部道具のせいにする
DQNが増えてきたってことですかね。

509:nobodyさん
03/09/08 10:14
>508
ハゲドウ

しかし、不良だらけの道具を平気で売ってる大企業とかも在るのが実情ではある。
M$とか。

510:496
03/09/08 13:21
>おいおい、何はぐらかしてんだ?
>>Windowsやover networkでうまく働かない以外に何か問題あったっけ?

perldoc -f flockから引用
>Calls flock(2), or an emulation of it, on FILEHANDLE. Returns
>true for success, false on failure. Produces a fatal error if
>used on a machine that doesn't implement flock(2), fcntl(2)
>locking, or lockf(3).

>On systems that support a real flock(), locks are inherited
>across fork() calls, whereas those that must resort to the more
>capricious fcntl() function lose the locks, making it harder to
>write servers.

というように、いい加減なfnctl(2)によりエミュレーションされた場合は
サーバーの書き込みが激しい場合ロックが失われると書いてあります。

>>他の方法を使ったほうが限界性能が上がると言いたかったのですが…。
>他の方法とは?

データベース側に専用のロック機構があれば、そちらにお任せしますが?
全部flockしますか?

511:nobodyさん
03/09/08 23:47
>>510=>>496
こいつ何言ってんだ?勝手にデータベース使うな。

512:nobodyさん
03/09/09 02:09
>>510
んじゃ、perlにflock(2)の呼び出しが実装されてれば問題がないということでよろしい
でしょうか?

俺は思わず「fcntlがダメダメ -> POSIX準拠と呼べない -> UNIX系とも呼べない」
と思ってしまったが。

513:496
03/09/09 20:09
>>512
flock(2)が機能して、正しく使えていれば問題ないかと。
私の知る限りでは、fcntl(2)でも十分信頼性はあると思いますけどね。

514:nobodyさん
03/09/12 14:11 e1VX9Ox6
flock(2)とPerlのflockを混同するから話がややこしくなるんだよな。

flock(2)はover networkじゃなく、正しく使えば基本的に堅牢。
Perlのflockはコンパイルされた環境依存、ってとこか。
fcntlでもちゃんとPOSIXに準拠してれば問題ないはず。

その腐ったfcntlを実装してるOSが何なのか知りたい。
Larryの事だから、誰も使わないようなかなりマイナーな物を
想定しているような気がするが。

しかしfcntlは堅牢でないからDBを使う、といってる人がいたが、
じゃぁそのDBはどうやってファイルをロックしてるんだろう?

515:nobodyさん
03/09/12 19:43
システムのロック以上の能力を持つロックは不可能です。

と言い切ってみるテスト…。

516:nobodyさん
03/09/13 00:45
fcntl がクソな実装を具体的に挙げられない限り、flock 否定派の香具師は議論にならん。

517:nobodyさん
03/09/13 23:39
>>516
UNIX系ならまず大丈夫、ということで良いだろ。
fcntl失敗する時点でUNIX失格だからな。

518:nobodyさん
03/09/14 21:13
>>514
PostgreSQLだったらセマフォ。

>>517
URLリンク(qmail.jp)でも触れられているが、
NFSでlockdが腐る現象がまれに発生する事を実際に経験している。
(俺は信者じゃない)

519:518
03/09/14 21:24
> PostgreSQLだったらセマフォ。
これ、やっぱ嘘かも。
しかし、排他制御のプリミティブはfcntlやflockだけではない。

520:nobodyさん
03/09/15 06:39
突然だけどflockってなんて読んでる?

521:nobodyさん
03/09/15 06:42
えふろっく

522:nobodyさん
03/09/15 07:54
ファイナルロック>510


523:nobodyさん
03/09/15 10:38
限界でもファイルロックだろうね。

524:nobodyさん
03/09/15 17:19
search.cpan.orgで、flockとかfile lockをキーで引いてみると
結構でてくるのですが、どれかお勧めはありますか?
それとも毎回自分で処理を書いたほうがいいのでしょうか?


525:nobodyさん
03/09/15 18:11
このスレでそんな質問しても無駄。
「flock は腐ってる。 DB 使え」という答えしか返ってこない。

526:nobodyさん
03/09/15 23:20
>>524
それぞれ用途が違うから、必要に応じて使えばいい。

527:nobodyさん
03/09/15 23:44
>>525
そんなこと書いてるのは約一名だろ。

>>524
perl -MConfig -e 'print $Config{d_flock}."\n"'

これ実行して「define」と出ればflock(2)が実装されてるからまず大丈夫。
ネットワーク越しでなければラクダ本に書いてあるflockのサンプルで充分。

528:nobodyさん
03/09/16 00:04
ラクダ本の見て必要無いのにseek(FH, 0, 2)とかやってる奴
何人か見た事あるので充分なのかどうかは微妙とか言ってみるテスツ。


529:nobodyさん
03/09/16 01:04
最近はseek(FH, 0, 2)いらんよね

530:nobodyさん
03/09/16 02:04
>>528
別にseekやってもオーバーヘッド以外の害はないんだし、害がある場合もレアケースながら
存在するので、的確かどうかはともかく、少なくとも「充分」ではあるのでは?

531:nobodyさん
03/09/27 12:58
こんなロック処理はどうだ?

mkdirで新規ディレクトリを作ったうえで、ロック成立条件を満たした場合にロック完了とする。
ディレクトリ名にタイムアウト時刻と共有/排他ロックの種別を埋め込む。

共有ロック時はディレクトリ作成後に、親ディレクトリのファイルリストを取得して、
自分の作ったディレクトリよりも前に排他ロックディレクトリが作成されていなければ、ロック完了。
排他ロック時も同様に、自分の作ったディレクトリよりも前にディレクトリが作成されていなければ、ロック完了。
もちろん、ファイルリスト取得時にタイムアウト時刻を過ぎたディレクトリは消去する。

環境依存せずに、read-write lock patternをperlで実装するとこうなるね。

532:nobodyさん
03/09/29 13:16
環境依存せずに。。。という話なんだけど、
flockサポートしてない環境ってそんなに一杯あるんですか?
windows 9xでサーバ立てる香具師はほっといたとして、、、
nkfのlock機構って精度低いんですか?


533:nobodyさん
03/09/30 04:58
>>532
nkf の lock 機構ってのは聞いたことないんだが、

・・・っていうか、一体いつまでおんなじような議論を堂々巡りで続ける気なんですか?!?!

534:nobodyさん
03/09/30 05:00
あ、ところで、 >>531 の方法は、
なかなか良さげっていうか、問題無さそうな気がするんですがどうなんでしょうね?

535:532
03/09/30 11:52
nfsの間違えでした(スマソ

536:nobodyさん
03/09/30 12:29
>>534
ほぼ同じ仕様のコードが既に公開されてて、有難く使わせて頂いてます。

537:531
03/09/30 17:11
>>536
どこで公開されてたか教えれ!

538:nobodyさん
03/10/02 03:29
>>536
もしかして、ここかしら?
URLリンク(www.mindcompass.sfcgi.com)

539:531
03/10/02 09:02
>>538
やっぱうちのサイトですか(w

で、今改良版を作ってるのですが、タイムアウト時刻をディレクトリ名にすると、同時にタイムアウト時刻が
違うロックを作ると誤動作するな。

だから、現在時刻をディレクトリ名にして、ディレクトリの作成時刻をタイムアウト時刻に変更すると言う
アクロバティックな操作が必要かもね。

改良版出来上がったら公開しますか?(y/n)



540:nobodyさん
03/10/02 16:33
>>539

自作CGIを評価するスレ
スレリンク(php板:470番)

何これ。恥ずかしがりやさんなのかな。


541:nobodyさん
03/10/02 22:14
>>540
さんくす。こんなスレがあるとは知りませんですた。
さっそくそっちのほうにageてみました。

542:nobodyさん
03/10/03 18:38
>>541
いやいや何か勘違いしてない?
ファイルロックの話なんだからこのスレでいいだろう。

俺の言いたかったのは>>539の最後に(y/n)があって、
何故かスレリンク(php板:470番)
yと答えてたので報告したまでです。


543:nobodyさん
03/10/03 18:51
>>531
これって安全そうでよさげな気はするんだけど、
ちょっと思ったんだけど、ものすごくアクセス多い場合に、
ディレクトリ作成~ファイルリスト検査のタイムラグのせいで、
いつまでたってもだれもロックを取得できない、ってな状況になりそうな気がする。

544:531
03/10/05 10:57
新バージョンageてみました。
今度の奴は、ロックする側のプロセスがタイムアウト時間を個別に設定できます。

URLリンク(do.sakura.ne.jp)

>>543
確かにファイルリスト検査に時間がかかるが、ならばどうしろと?


545:nobodyさん
03/10/06 12:54
>>544
いや、どうすればいいか私にも思い付きません。すいません。
単にデメリットを挙げてみただけで、
だからといってその方法が使えねーとかいう気も毛頭ありません。

546:531
03/10/06 22:56
>>544>>545
さらに一念発起してrename方式に変更してロック処理にかかる負荷を低減してみました。

rename方式でテストしたらロックがぶっ壊れるなー、とか思ってたら
ロック検証用のルーチンの書き方に問題があった罠。
同じファイルを読み込みと書き込みで2回オープンして、しかもバッファ処理をカットしてなかったので、
スクリプト上では書き込んだつもりでもファイルシステム上では「まだ」書き込まれてない場合があることに
ようやく気がついた。

教訓。
ロック処理が正しくても、ファイル入出力の部分の書き方によっては思わぬファイル破損がありうる。

547:531
03/10/07 18:17
>>546
やっぱりread-write lockってむづかしいでつね。
rename方式だと、共有ロックをかけているプロセス数が分からないといつロック解除していいかわからない。
ロックプロセス数を安全に記録するために、内部で排他ロックをかけなければいけない罠w
これでどのくらいロック処理で負荷がかかるか、だな。


548:nobodyさん
03/10/29 05:07
複数ファイルにまとめてロックを掛けるにはどうすれば良いのですか?

例えば掲示板で最初のページだけ静的なファイルにしたいという場合、
ログとその最初のページの両方を同時にロックしないといけないので。

FLOCKのディレクトリ版とかあれば便利なのですが…。


549:nobodyさん
03/10/29 06:01
>>548
ロック開始と解除の間で必要なファイルを扱えばいいだけ

ロックの仕組みを根本的に理解していないんじゃないか?
もうちょっと勉強せい

550:nobodyさん
03/10/29 08:13
【Perl】ファイルロック(排泄処理)について語ろう
スレリンク(php板)

551:nobodyさん
03/11/03 16:44
>548
URLリンク(www98.sakura.ne.jp)


552:nobodyさん
03/11/05 02:38
>551
flockってロックしたファイルが閉じるまでに開いた他のファイルまで
全部ロックしちゃうの?


553:nobodyさん
03/11/05 04:25
>>552
お前、リンク先のサイトの内容ちゃんと読んだか?

554:nobodyさん
03/11/05 11:35
>>551
リンク先面白かった。初心者にもわかりやすい情報をWebで公開してくれる人って、尊敬。

555:nobodyさん
03/11/05 14:16
>>553
読んだけど。
かいつまんで書くと

lockfileを開く
lockfileをロック
count.txtを開く
上書き
count.txtを閉じる
addr.txtを開く
追記
addr.txtを閉じる
lockfileをアンロック

だよね。
count.txtとaddr.txtには直接ロックかけてなくて
lockfileをロックすることによりこの二つのファイルもロックされてるらしいから
>551みたいに言った。


556:nobodyさん
03/11/05 14:16
552だ。

557:nobodyさん
03/11/05 14:28
ああ何となく解ってきた。
よく考えたらlockfileがロックされてるときはそこから先に進まないから大丈夫なのか。


558:nobodyさん
03/11/08 02:04
ロック用ファイル作らなくても
どっちかのファイルにロックかけて最後まで開いてるままで十分だけどな。


559:nobodyさん
03/11/08 13:26
>>558
あんた無茶苦茶言いますなぁ・・・

560:nobodyさん
03/11/08 13:37
無茶苦茶???いったい何が???

561:nobodyさん
03/11/08 15:28
>>559
count.txtにロックかけてそのままabbr.txtの処理終わるまで開いときゃ良いじゃん。


562:nobodyさん
03/11/08 17:35
addrだった。

563:nobodyさん
03/11/09 03:10
>>561
レアケースだろうけど
似たような事して壊れたことあるよ
無茶苦茶って事では無いだろうが、
そのやり方だと同時オープンで
2人アクセスしてきたのに1しかカウントアップしないって
ケースがタイミング良ければ発生する程度かな

564:nobodyさん
03/11/09 10:32
>>561
どうやってロックするんですか?

565:nobodyさん
03/11/09 14:47
>>563
なんでそうなる?単にヘボ実装だっただけじゃないの?

566:nobodyさん
03/11/09 15:19
>>563
なるわけないだろうが

567:nobodyさん
03/11/09 18:12
>563
単に読み込みをブロックしてなかっただけってオチなんじゃ。
それか二つのファイルでファイルハンドルを同じにしちゃったとか…。

>564
open(COUNT, "+<$cfile");
flock(COUNT, 2);
(中略)
open(ADDR, ">>$afile");
(中略)
close(ADDR);
couse(COUNT);


568:nobodyさん
03/11/09 18:18
ちょっと複雑なシステムで
複数のスクリプトが複数の同じファイルを読み書きする場合は
ロック用ファイルを一つ用意する方が管理が楽なのは当たり前。

でもカウンターのようにファイルが単一のスクリプトからしか読み書きされない場合は
どちらか先に読む方のファイルをロックしておけば十分。


569:nobodyさん
03/11/09 18:46
>>565
>>566
無能か?(w
ググルとたくさんでてくるぞ、そのケース

570:nobodyさん
03/11/09 18:58
わけわかんね。
サーバがflockをきちんと使えないシステムを採用してたとかじゃないの?


571:nobodyさん
03/11/09 19:03
>>569
きっと君と同じぐらい無能なやつなんだろうね
ここでそんなこと言ってるのも君ぐらいだし

572:nobodyさん
03/11/09 19:42 BVCYv2fe
>>570,571
馴れ合いはよそでやれよ・・・
ま、>>555は書いてるとうりにすれば問題無し
わざわざ混乱させんでもよかろうに

573:572
03/11/09 19:48
ageちまっていいスレだよな・・・

それか、
>>567-571はジエン厨じゃあなかろうなぁ?


574:nobodyさん
03/11/09 19:55 4SnYD/Cs
 | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
 |.本日選挙は20時迄!|
 |__________|
   ∧∧ ||
   ( ゚д゚)|| <残り10分切ったど!
   / づ     投票してない香具師は自衛隊の代わりにイラク逝けよ。

※総務省によると、総選挙の中間投票状況は
9日午後4時現在、全国平均で40.04%。前回を1.40ポイント下回っている。

575:nobodyさん
03/11/09 19:59
>>573
あれが自演ならお前さんも>>569か?って事になるじゃん…。
本当だったら煽った挙句自演呼ばわりですかって感じで笑えるけど。


576:nobodyさん
03/11/09 20:28
>>569
ハァ?
じゃあ「そのケース」とやらをここに貼れよ。
そのヘボ実装を検証してみようや。

577:nobodyさん
03/11/09 20:54
>>572
馴れ合い?

578:nobodyさん
03/11/09 21:14
>>577
「馴れ合い」の意味を知らないだけだろ。無知は構うな。ほっとけ。

579:564
03/11/10 14:47
あれ?flockが使える環境の人もこのスレの需要あったの?
まぁどっちでもこの場合変わらないけど。

580:nobodyさん
03/11/10 14:53
>>561が勝手にflockと勘違いして
勝手に自分のやり方を押しつけたって事かぁ(・∀・)

581:nobodyさん
03/11/10 16:11
>>580
ということにしたいのですね? :-)

582:nobodyさん
03/11/10 16:19
もうほっとけほっとけ

583:nobodyさん
03/11/10 16:43
♪か~な~しみ~に~であうた~び~

584:nobodyさん
03/11/10 16:56
↓【Perl】flock() の使えない環境下でのファイルロック(排他処理)について語ろう

585:nobodyさん
03/11/10 20:26
俺ん中の結論はRename形で、不雑なものになると管理が難しくなるんだよなぁ

586:nobodyさん
03/11/10 20:34
>>585
何の管理?

587:nobodyさん
03/11/10 20:37
同じディレクトリに複数のDATがある場合
ユニークなファイル名を生成するようにしないと。

…今思ったけど、たいした事無いなw

588:蟻の子一匹通さないロック
03/11/14 04:40 uv5dJ3X6
10 GOTO アルカトラズ島;  # ロックへようこそ
20 処理;             
30 逆転無罪;          # 真犯人逮捕⇒釈放

589:nobodyさん
03/11/14 05:44
>>580
>551からの流れでずっとflockの話だったわけだが。


590:nobodyさん
03/11/14 16:05
どっちでも変わらん。
つーか変わってくるとしたらあれだ・・・


掲示板とかのスクリプトで
LOG→HTML随時吐き出し型
じゃなく
LOG=HTMLを表示する型
の場合、Rename型の排他処理は行えない可能性がある。

ということで。
結論から言えば退避ファイル名をhtml→htmとか適当に変えればいいんだろうけど。

591:nobodyさん
03/11/14 17:52
このスレって二つの話題が流れてるんだが。

・flockが使えない環境ではどうしてる?
・ロックの有効性はその方法でなく、ロックを組み込む場所が大事。壊れる原因の大半は誤った使い方によるものなので、ありがちな落とし穴の再検証をしよう。

後者をよく理解してない初心者・中級者が、「flockで壊れた!flock使えねー」とわめいて、前者と後者をまぜこぜにして語って、スレが荒れるのが常。


592:nobodyさん
03/11/14 18:00
それでわめいてるやつは中級とは言えないだろう

593:nobodyさん
03/11/14 18:11
1 nobodyさん 02/06/23 10:18 ID:eY2l+Gw1
 どんな環境でも使えて、軽くて、頑丈なロックを考えようじゃありません

594:nobodyさん
03/11/14 18:32
>>593
そいつは日本語が初心者なんだよw

595:nobodyさん
03/11/14 18:38
たった今594が1を煽りました。

596:nobodyさん
03/11/14 18:55
さあ、>>1よ щ(゚Д゚щ)カモーン!!

597:nobodyさん
03/11/15 08:26
>>590はどうなの?

598:nobodyさん
03/11/16 17:30
横レスすまんが、MySQLでも突っ込んでおけば、lockはぜんぶDBが
やってくれるやん・・・・・・・・ってのはだめなの?
あくまでOSにLockさせないとあかん?

599:nobodyさん
03/11/16 17:34
はいはい、あっち行ってね

600:nobodyさん
03/11/16 21:35
>>598
どうしてそうやって意地でも議論をループさせようとしますか?

601:nobodyさん
03/11/17 02:04
あーごめん。実用の話じゃなくて、神学論争だったのね。
空気よめなかった。すまそ。

602:nobodyさん
03/11/17 02:16
>>601
ていうか DB 使えるならその方がいいし、既に過去レスで全く同じやりとりが何度も出てるし。

603:nobodyさん
03/11/18 14:37
>>601
釣れますか?

604:nobodyさん
03/11/18 17:29
たとえば解析なしのアクセスカウンターにSQL使ってるのを俺は見た事ないな
俺が見た事ないだけかもしれないが

605:nobodyさん
03/11/18 22:15
>>604 大規模サイトだと解析前提だからDBだな。そのほうが楽だし。
個人サイトならカウンタCGIを置くだけでしょ。壊れても問題ないし。

どしてもというなら、セマフォ管理するプロセスを立ち上げといて
それ使うって手もあるのかもしれんがそれならDB使うよ。
OSのファイルロックはアトミックじゃないっす。ソラリスでもそう。
マルチアクセス前提のファイルシステムもあるが、民生用じゃないな。

606:nobodyさん
03/11/21 00:36
>>605
大規模サイトが、アクセスカウンターで解析するか?
ふつー、Webサーバのアクセスログを解析するだろ。

> OSのファイルロックはアトミックじゃないっす。ソラリスでもそう。
お前の使い方がヘボなだけ。

607:nobodyさん
03/11/21 01:22
>>606 ログ解析だけで済めば世の中楽だよなー

608:nobodyさん
03/11/21 01:56
607だけだとあおりみたいだから、いちおー。
確かに大規模サイトにはカウンタはないな。でもユーザーごとにレスポンスを
細かく制御すると、リアルタイムなユーザー管理いるからどうしてもDB。
ログ解析だけだとマーケティングデータしか出てこない。インタラクティブ
リアルタイムにそれ使わないと意味なしな。
静的なサイトでページビューだけでいいならログだけでいいけど、それじゃ
このスレの話題ずれる。
ちなみに俺はDB使わない程度のサイトならservletでロック処理。

609:nobodyさん
03/11/21 02:13
>>608
スレタイを何度も声を出してよく読んでから発言した方が良いのでは?
どう考えてもあなたのレスはどれもこのスレにはお呼びでないと思うのですが?


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch