ズバリ、CGI二重起動防止ロック処理のソースをもしよかったら、だれか教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

実用的には、Sephy さんの方法でほぼ十分だと思います。

しかし、
もし絶対に二重に起動しては困るという場合には、二つのCGIがほ
ぼ同時に起動されてしまうと、つまり相次いで getc して中身がな
いことを確認してしまうと、二つともロックが成功してしまうので
完全ではありません。

UNIX 上の Perl であると仮定しますが、ロックに使える機構とし
ては、flock か fcntl を使う方法、link, symlink, mkdir は存在
していると成功しないことを利用する方法、umask を適当に(0777
あたりに)セットしてアクセス禁止のファイルを作る方法が考えら
れます。

flock/fcntl は UNIX がプロセスの存否を管理しますので、プロセ
スが不意に死んでもロックがかかりっぱなしにならないという利点
があります。このうち、fcntl は UNIX の低レベルのインタフェー
スなのでちょっと面倒かもしれません。flock が簡単でしょう。

まともな perl の参考書なら、flock の解説もあると思います。
man perlfunc で flock の項を調べてもサンプルのコードが載って
います。

もしコードが必要なら、補足してください。ただし、ロックに失敗
した側がは、そのまま終了してしまえばいいのか、ロックできるよ
うになるまで待ってロックするのかで変わりますので、明記してく
ださい。また、ロック後に操作するファイルがあらかじめ固定され
ている場合は、そのファイルを使ってロックする方が、無駄なファ
イルを作らずにすみます。
    • good
    • 0

アクセスログを取るCGIを使っているんですか?


だとすれば多重起動を防止しなければならない状況とは
おそらくカウントを取る時でしょう。

ただ下記の私のソースだと多重起動時に終了させてしまうので、

die"busy"



select(undef,undef,undef,0.1)

とかに書き換えたほうがいいかもしれません。
後者は「0.1秒待つ」という意味です。

どちらにせよ下記の指摘のように、
同時にアクセスがかかった場合には弱いと思います。
    • good
    • 0

>OKWebさんは<の変換の仕方を間違っているみたいなので


>ソース書いたけど見づらいです。

あ、回答するときの表示だけみたいです・・・
忘れてください。
    • good
    • 0

さっそく自己補足・・・



----------

# ロックファイル名
$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はこのままでいいのでしょうか。
全くの初心者なので、よく分かりません。もう少し詳しく教えていただけますか。

補足日時:2000/12/18 13:29
    • good
    • 0

こんな感じでどうでしょう?





# ロックファイル名
$LOCK = 'lock.loc';

# ロック処理
open(LF,"+<$LOCK");
die"busy" if(getc(LF));
print LF 1;
close(LF);

# ここに処理内容を書いてください。

# アンロック処理
open(LF,">$LOCK");
close(LF);
    • good
    • 0

いくつか種類はあると思いますので参考程度にどうぞ。


 必要なら参考ソースをまた書きます。
 1, 起動時に何らかのファイル(ロックファイル)を作成しそれが存在すれば、起動しない、プログラムが正しく終了する直前にファイルを消す。
注意としてはプログラムが不正終了したときにファイルが残ってしまうので、それを時間によって消去することが必要。
 2,システムのプロセスをみて判断する。

 今思いつくのはこのぐらいです。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCGIの処理中に次の処理が出来る?

perlで書いたCGIの処理時間が非常に長いのです。
処理は数百名に対してメールを配信するもので、テキストで書かれた数百のメールアドレス配列に対してループ文で一人ずつメールを配信しています。これが約4分くらいかかります。
質問は2つあって、
(1)まずこのメール配信の処理を早くする方法はないでしょうか?
 配信アドレスは自動的に追加されたり削除されたりするので固定のML
 を使う事ができませんので、個別にメールを送る方法を取っていま  す。
(2)メール配信をバックグランドで実行させて、メインのプログラムは
 復帰させる、という方法が出来るでしょうか?
 今は、メインCGIが画面の表示やメールの配信などほとんどを実行し
 ています。
 このような場合、メール配信中はそのメインCGIが実行権を握った
 状態になる為、他のユーザはこのメインCGIを実行出来ないと思って
 いるのですが、間違った認識でしょうか?
 もしそうだとすると、早くメインCGIの実行権を他のユーザに明け渡 さなければならないと思うので、メール配信を別CGIで実行させたほ うが良いのかな?と思った次第です。

 よろしくご教示下さい。

perlで書いたCGIの処理時間が非常に長いのです。
処理は数百名に対してメールを配信するもので、テキストで書かれた数百のメールアドレス配列に対してループ文で一人ずつメールを配信しています。これが約4分くらいかかります。
質問は2つあって、
(1)まずこのメール配信の処理を早くする方法はないでしょうか?
 配信アドレスは自動的に追加されたり削除されたりするので固定のML
 を使う事ができませんので、個別にメールを送る方法を取っていま  す。
(2)メール配信をバックグランドで実行させて、...続きを読む

Aベストアンサー

がると申します。
1番については「処理次第」としか言いようがないのですが。#1さんの補足質問のコードを見てる限りですと「普通はこんなもん」だと思うです。
ここから速度アップを考えると、smtp関連で結構突っ込んだコードになってくるので、「業務的に必須」とか「やる気が両手からあふれかえっている」とかでなければ、このままでよいように思うです。
ちなみに、$mailfile を読み込む際の
flock(OUT,8);
は不要です。
# flockの解除は「しない」癖をつけたほうが安全です。

んで。
私は「まとめて送信」には比較的懐疑的です。
一つには、ユーザ的に「メールヘッダのToが自分のアドレスである」ほうが好感度が高いのが一つ。
もう一つが、まとめて送るときはSMTP的に「RCPT TO」とうコマンドを列挙するのですが、これには数量限界がありまして。RFC的にもさほど多くない上に(ちょっと記憶に浅いのですが、たしか100~200程度)、実装上ではさらに低い上限(たしか10~20くらい)もありまして。そのあたりから考えるに、まとめての送信はちょっと微妙です。

2番についてですが。
forkなどで別プロセスをたたき起こすことによって「バックグラウンドでの実行」は可能です。ただ、厳密にはforkで作った子プロセスには2パターンの挙動がありまして。さらにHTTPdの挙動も微妙で。
まずforkの子プロセス周りですが。「子プロセスが実行中に親プロセスが終了。子プロセス君、君はどうする?」と質問すると、「んじゃぁ親プロセスのもう一つ上(大抵はプロセスID 0のプロセス)と親子関係結びなおしてそのまま実行」という独立心旺盛な場合と「親が死んだんだもの、僕も一緒に~」という情愛豊かに終了してしまう場合とがあります。
次にHTTPdですが「親プロセスしか監視しない」タイプと「そこから派生した全てのプロセスをチェック」するタイプがやはり存在します。
ですので、可能か不可能かは「環境次第」になってしまいます。
環境に依存しないためには、
・CGIで「メール送信依頼」をどこか(ファイルまたはDB)に設定する
・cronで定期的に送信依頼をチェック、依頼があれば遂行する
というほうがより安全です。

ちなみに「メール配信中はそのメインCGIが実行権を握った状態になる為、他のユーザはこのメインCGIを実行出来ない」ってのは明確に誤りです。
細かく書くと長くなるので省略しますが、基本的にプログラムは「あちこちから呼ばれてパラレルに動くことが可能」です。そのあたりはプロセスとかその辺を勉強すると色々わかると思います。

以上、なにか参考にでもなれば幸いです。

がると申します。
1番については「処理次第」としか言いようがないのですが。#1さんの補足質問のコードを見てる限りですと「普通はこんなもん」だと思うです。
ここから速度アップを考えると、smtp関連で結構突っ込んだコードになってくるので、「業務的に必須」とか「やる気が両手からあふれかえっている」とかでなければ、このままでよいように思うです。
ちなみに、$mailfile を読み込む際の
flock(OUT,8);
は不要です。
# flockの解除は「しない」癖をつけたほうが安全です。

んで。
私は「まとめ...続きを読む

QCGIのソースを見る方法

CGIのソース(Perl)を見る方法は無いでしょうか?
よろしくお願いします。

Aベストアンサー

クライアントから、サーバ上のCGIを見たいって
勝手に想像しながら回答かいてます。
間違ってたらごめん。

RedSpiderさんが、サーバの管理者だったら、telnet等のツールで
サーバに管理者権限で接続すれば見ることができます。

でもRedSpiderさんが一般ユーザだったら、
たとえば「このgooのサイトのCGIを見たい」ってことなら、
残念ながら不可能です。
あぁ、もとい「goo」のサイト管理者とお友達になればOK。見れます。

QCGIソース中のHTMLタグですが。。。

print "<input type=\"text\" value=\"name\" />";
とか
print "<hr />\n";
などの

「/」 の役割がわかりませんが、必要でしょうか。
「/」 が無くても動作しているようでしたが。。。

本当に初歩的で失礼な質問かも知れませんが、
教えていただければ本当にありがたいです。

どうぞよろしくお願いいたします。

Aベストアンサー

XHTMLだと必要。
XHTMLは、yatokesaさんが既に回答してます「XML」をベースに、HTMLの仕様を再定義した、後継仕様です。
XMLは、必ず開始タグ(<h1>とか。)と終了タグ(</h1>とか、)が対にならないといけませんが、空要素(開始タグと終了タグの間に何も入れちゃダメ。)については、

<e></e>

と書く代わりに、

<e />

という書き方も認めてます。
で、XHTMLでは、<br>や<img>などを、<br />や<img />と書くようになっている、という事です。

参考URL:http://www.atmarkit.co.jp/fxml/askxmlexpert/022xhtml/22xhtml.html

Q次の内容のCGIを探しています。もし知っている方いましたら教えてください。

次の内容のCGIを探しています。もし知っている方いましたら教えてください。宜しくお願いいたします。
●会員登録フォームで登録する内容は、好きなID、メールアドレス、名前、パスワードを入力してもらい、送信してもらう。IDやメールアドレスの重複があるなら自動認識して「このIDは既に使用されています」などのメッセージを表示する。登録完了したらメールアドレス宛に登録完了のメールを自動返信し、TOPページから、ID、パスワードを入力してログイン出来るようにする。
そんなCGI配布しているところなんてないでしょうか?
yahooのID登録のような物を作成したいです。

Aベストアンサー

自動ではないですが、参考までに。
http://www.kent-web.com/pwd/index.html

参考URL:http://www.kent-web.com/pwd/index.html

QCGIプログラムを使った申し込みフォームをHTML形式のメールで送りました。ソースを開くと文字化けしてしまいます。

CGIプログラムを使うことにより、WEB上から申し込みフォームを使って入力事項をHTML形式によりメールしました。しかし、ソースを開いてみると文字化けしています。
CGIプログラムは、Shift JIS で保存したものを送信しているのですが。。
どうすれば、文字化けしない、きれいなソースが見れるようにできるでしょうか?

Aベストアンサー

こちらでも失礼します :-)

インターネットのメールで日本語表記を利用する場合はそもそもJIS(ISO-2022-JP)の7Bitで送信するのが暗黙のルールとなっています。
つまり、Shift JISのまま送り出すのではなく、JISに文字コードをコンバートしてから送り出せば良い訳です。
簡単に実現するには nkf という外部コマンドを1PASSさせるか、jcode.plというperlモジュールを用います。

ただし単純に全ての文書をnkfやperlを通すとメールヘッダ内のSubject:等もJISコードに変換されてしまいます。
メールヘッダに関してはmime変換を行う様にと rfcで取り決められています。
(現実にはこのmime実装にも色々とトラヴルが発生しますが)

尚、メールヘッダ及びメール本文に相当するHTMLの Content-type;指定も ISO-2022-JP (←JISの事) に統一しないと、受信したメーラで正しく認識できなくなりますので注意してください。

出口は近いです。ガンバってくださいネ :-D

参考URL:http://internet.watch.impress.co.jp/www/article/1999/1122/special.htm

こちらでも失礼します :-)

インターネットのメールで日本語表記を利用する場合はそもそもJIS(ISO-2022-JP)の7Bitで送信するのが暗黙のルールとなっています。
つまり、Shift JISのまま送り出すのではなく、JISに文字コードをコンバートしてから送り出せば良い訳です。
簡単に実現するには nkf という外部コマンドを1PASSさせるか、jcode.plというperlモジュールを用います。

ただし単純に全ての文書をnkfやperlを通すとメールヘッダ内のSubject:等もJISコードに変換されてしまいます。
メールヘッダに関...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報