[Perl] 行数制限のあるログファイルに安全に1行追加する方法は?
[上に]
[前に]
[次に]
とん平
2000/02/25(金) 03:02:08
logfileの先頭に$dataを追加して、最終的に$max行になるようにしたいので、
以下のスクリプトを書いてみました。
正しく動作はしていますが、close(LOG)とrenameの間に別プロセスが割り込んだときが
心配です。
そこで、flockが100%効くという前提で、どのようにしたら完璧かご教授ください。
open(LOG, "logfile");
flock(LOG, 2);
open(TMP, ">>tmpfile");
print TMP $data;
$i = 1;
while (<LOG>) {
print TMP $_;
if (++$i == $max) {
last;
}
}
close(TMP);
close(LOG);
unlink("logfile");
rename("tmpfile", "logfile");
しなのむし
2000/02/25(金) 04:27:22
あらかじめロック用のファイルを用意する。
open(LOCK "ロック用のファイル");
flock(LOCK,2);
様々な処理
close(LOCK);
# flockが100%効くという前提で・・・
しなのむし
2000/02/25(金) 04:41:59
>open(LOCK "ロック用のファイル");
open(LOCK, "ロック用のファイル");
配列に読み込んでも良いのなら
open(LOG, "+< logfile");
としてtmpfileを作らないとか。
Ichi
2000/02/25(金) 05:50:22
truncateできるのなら、
# (tmpfile作成終了)
truncate(LOG,0); # LOGの長さを0(空)にする
seek(LOG,0,0);
seek(TMP,0,0);
while (<TMP>) {
print (LOG $_)
}
close(LOG);
close(TMP);
とか。
Ichi
2000/02/25(金) 05:52:55
一応訂正。
>print (LOG $_)
print (LOG $_);
です。
しなのむし
2000/03/05(日) 05:45:39
>open(LOCK "ロック用のファイル");
>flock(LOCK,2);
open(LOCK ">ロック用のファイル");
flock(LOCK,2);
に修正。
Read onlyで開いた時に書き込みロックしても効かないようだ・・・
しなのむし
2000/03/05(日) 05:47:38
また、","が抜けてた。。。
[上に]
[前に]
[次に]