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ランキング
-
フォームを再送信しますか?
-
cgi アクセス制限 エラー
-
ラズパイでのCGIで、pythonソー...
-
エクセルで集計したい。
-
CGIなのにIE8のときキャッシュ...
-
apacheでPerl CGIが作動せず、5...
-
cgi perl 同じ変数で一つはカン...
-
Movable Type 5 個人無償ライセ...
-
ロリポップでCGIを設置する
-
めちゃきれい
-
number 改行が追加できない
-
生成AI画像について
-
3DCG
-
ホームページにメールフォーム...
-
CGIの記述について教えてくださ...
-
CGIの設置が分かりません・・・
-
ホームページにCGIを設置したの...
-
ホームページにCGIを設置したの...
-
サーバーのエラーでおしえてく...
-
ホームページの事でおしえてく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fopenでディレクトリ内の全ファ...
-
ファイルロックの解除方法
-
TSVファイルを読み込んでCSV形...
-
[perl] perlで書き込み中に、PC...
-
Cookieが保存できない。
-
perlをデスクトップのショート...
-
最新のファイルのみ検索
-
flockについて
-
unixでのファイルロックの方法...
-
ファイルの結合
-
perlでCSV形式ファイルのア...
-
CGI のモジュールをつかってフ...
-
ファイルがオープンできない
-
HTMLの中にCGIファイルリンク
-
file_exists関数について
-
1行がやたら長いテキストをバッ...
-
ファイル名の切捨てとリンクの...
-
perl の printでのファイルへの...
-
Perl 処理速度について
-
ファイルの存在確認をしたい
おすすめ情報