No.5ベストアンサー
- 回答日時:
実用的には、Sephy さんの方法でほぼ十分だと思います。
しかし、もし絶対に二重に起動しては困るという場合には、二つのCGIがほ
ぼ同時に起動されてしまうと、つまり相次いで getc して中身がな
いことを確認してしまうと、二つともロックが成功してしまうので
完全ではありません。
UNIX 上の Perl であると仮定しますが、ロックに使える機構とし
ては、flock か fcntl を使う方法、link, symlink, mkdir は存在
していると成功しないことを利用する方法、umask を適当に(0777
あたりに)セットしてアクセス禁止のファイルを作る方法が考えら
れます。
flock/fcntl は UNIX がプロセスの存否を管理しますので、プロセ
スが不意に死んでもロックがかかりっぱなしにならないという利点
があります。このうち、fcntl は UNIX の低レベルのインタフェー
スなのでちょっと面倒かもしれません。flock が簡単でしょう。
まともな perl の参考書なら、flock の解説もあると思います。
man perlfunc で flock の項を調べてもサンプルのコードが載って
います。
もしコードが必要なら、補足してください。ただし、ロックに失敗
した側がは、そのまま終了してしまえばいいのか、ロックできるよ
うになるまで待ってロックするのかで変わりますので、明記してく
ださい。また、ロック後に操作するファイルがあらかじめ固定され
ている場合は、そのファイルを使ってロックする方が、無駄なファ
イルを作らずにすみます。
No.6
- 回答日時:
アクセスログを取るCGIを使っているんですか?
だとすれば多重起動を防止しなければならない状況とは
おそらくカウントを取る時でしょう。
ただ下記の私のソースだと多重起動時に終了させてしまうので、
die"busy"
を
select(undef,undef,undef,0.1)
とかに書き換えたほうがいいかもしれません。
後者は「0.1秒待つ」という意味です。
どちらにせよ下記の指摘のように、
同時にアクセスがかかった場合には弱いと思います。
No.3
- 回答日時:
さっそく自己補足・・・
----------
# ロックファイル名
$LOCK = 'lock.loc';
# ロックが不正だと判断するまでの時間
$LOCKTIME = 60;
# ロック処理
open(LF,"+<$LOCK");
die"busy" if((stat(LF))[9] + $LOCKTIME < time && getc(LF));
print LF 1;
close(LF);
# ここに処理内容を書いてください。
# アンロック処理
open(LF,">$LOCK");
close(LF);
----------
P.S.
OKWebさんは<の変換の仕方を間違っているみたいなので
ソース書いたけど見づらいです。
それと、私はロックのためだけにディレクトリのパーミッションを変更するのは気分的に嫌なので、
ファイルの中身で判断するようにしてます。
別にファイルの有無でもいいけど・・・
この回答への補足
このソースは、ログを集計するCGI(analyze.cgi)に書けばいいのか、ログを採る&累計カウント表示をするCGI(log.cgi)に書けばいいのかわかりません。後者のほうでやったら、カウンタが表示されなくなりました。
あと、$LOCK = 'lock.loc';のlock.locはこのままでいいのでしょうか。
全くの初心者なので、よく分かりません。もう少し詳しく教えていただけますか。
No.2
- 回答日時:
こんな感じでどうでしょう?
# ロックファイル名
$LOCK = 'lock.loc';
# ロック処理
open(LF,"+<$LOCK");
die"busy" if(getc(LF));
print LF 1;
close(LF);
# ここに処理内容を書いてください。
# アンロック処理
open(LF,">$LOCK");
close(LF);
No.1
- 回答日時:
いくつか種類はあると思いますので参考程度にどうぞ。
必要なら参考ソースをまた書きます。
1, 起動時に何らかのファイル(ロックファイル)を作成しそれが存在すれば、起動しない、プログラムが正しく終了する直前にファイルを消す。
注意としてはプログラムが不正終了したときにファイルが残ってしまうので、それを時間によって消去することが必要。
2,システムのプロセスをみて判断する。
今思いつくのはこのぐらいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからcgiを自動的に起動させたい 1 2023/02/21 19:39
- Perl perlのflock関数でロックをかけたままopen関数で何度もファイルを開きなおすことはできますか 3 2023/05/01 22:25
- CGI (フリーの)ツリー掲示版CGI、昔は多用させてもらいましたが・・今セキュリティ上どうでしょう? 2 2023/06/25 07:18
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて 重複したものがあれば行を削除するとい 1 2023/02/27 18:49
- その他(車) 高性能な盗難防止装置を教えてください 12 2023/07/05 13:33
- Android(アンドロイド) スマートフォン(Galaxy)の誤作動ロック画面が解除出来ない 1 2022/09/01 10:57
- 友達・仲間 いちゃもんをつけてくる人の対処法と考え方を教えてください。 2 2023/06/03 22:17
- Perl perlのrequireの動き方についての質問 2 2022/10/30 17:27
- iOS Ipad 1 2023/04/19 08:54
- その他(暮らし・生活・行事) 鍵の締め忘れの防止 公共施設の更衣室のロッカーの鍵を、立て続けに 締め忘れてしまいます。 鍵は、ナン 1 2023/08/10 21:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
1行がやたら長いテキストをバッ...
-
[perl] perlで書き込み中に、PC...
-
batファイルでrenameができませ...
-
エラー 'dir.h' : No such fi...
-
HTMLのフォームで画像と文...
-
ExcelをCSV書き出す場合のシー...
-
awkスクリプトでダブルクォーテ...
-
Perlの変数に文字数制限(容量...
-
readdir()で得られるファイル・...
-
ファイル全てを .xlsm に変更し...
-
while(<ハンドラ>) {} で行数を...
-
パスから最後のディレクトリだ...
-
テキストデータから指定した1...
-
一定時間が経過したフォルダの削除
-
htaccessで特定のディレクトリ...
-
ReadLineでの読み出し行を指定する
-
while文がうまく動かない
-
chdirがうまくできない
-
openした後、closeしないでプロ...
-
VBAでタブ区切りテキストの保存...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fopenでディレクトリ内の全ファ...
-
unixでのファイルロックの方法...
-
1行がやたら長いテキストをバッ...
-
VBでファイル分割の方法
-
ファイルの結合
-
ファイルがオープンできない
-
ファイルディスクリプタとは?
-
【PHP】アクセス過多でファ...
-
printscreenについて。
-
ファイルの存在確認をしたい
-
バッチファイルの作り方(CSV→...
-
awkスクリプトでダブルクォーテ...
-
VBAでCSVファイルの特定行を書...
-
DOSコマンドで、標準出力を出力...
-
ExcelをCSV書き出す場合のシー...
-
openした後、closeしないでプロ...
-
close()で例外が投げられる理由
-
batファイルでrenameができませ...
-
VBAでCSVファイルを途中行まで...
-
window.open でのファイル指定方法
おすすめ情報