ズバリ、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コード変換(漢字)のサンプルプログラム

始めまして!
困っています、御力添えをお願いします。
UNIX(SouOS5.8)でのコード変換(SJIS→EUC、EUC→SJIS)のコーディング(サンプルソース:C言語)をどなたか教えて頂けないでしょうか?
お願いします。

Aベストアンサー

下記URL参照。

参考URL:http://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/kanjicod.html

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の解除は「しない」癖をつけたほうが安全です。

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

Qブログ等で公開されているサンプルコードの著作権について

個人の方などが、ブログ等で公開されているサンプルコードについてですが、

あるプログラムの解説サイトで見つけた、サンプルコードと、
同じコードで解説しているサイトを2つ発見したので、こういうのって、法律的に、どういう扱いなのだろうかという疑問です。

Aベストアンサー

プログラミング言語や規約つまりプロトコルは対象外だけど、ソースは保護対象なんだってば。
当たり前だよ。プログラミング言語使って生み出された創作物なんだもん。
この辺、IT系資格の参考書でもたまに間違いを見かけるからわかりにくいんだろうね。

私は法学部卒の現役エンジニアです。
ソースコードが著作物なのは断言します。

QCGIのソースを見る方法

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

Aベストアンサー

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

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

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

Q数学演算のサンプルコード集のあるサイトを探しています(VB6)

VB6で数学演算のソースコードのサンプル集を探しています。

例えば今回は3次元のベクトルをX,Y,Z軸周りに任意の角度だけ回転する行列をプログラムしたいので、アフィン変換のサンプルなんかないかと探しています。いいサイトがあれば教えていただけませんでしょうか。

よろしくお願いします。

Aベストアンサー

まったくの素人なので、
参考になるかはわかりませんが、
検索したらこんなのがありました。

参考URL:http://files.codes-sources.com/fichier.aspx?id=37873&f=mdlMath.bas

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

QHead First PHPサンプルコード文字化け

よろしくです。
下記のphpの本を参考にプログラムを勉強しているのですが、
サンプルコード(完成品)の日本語部分(DBがソースの日本語部分全て)がすべて文字化けしてしまいます。
この本は文字化け対策を強みにした本なのですが、実際のサンプルコードがこんな状態なので非常に困っています。
例えば、表示サイトページ内に3時間というデータが表示される予定だとすると、3??(ハテナマーク)のように表示されます。
ちなみに文字化け後、ブラウザ、DB、phpの文字コード設定はutf8統一であることは確認しました。apacheの文字コードはわかりません。
テスト環境は、自宅のローカルサーバーと、某レンタルサーバーの2つでどちらでも文字化けです。

この本を試した方、もしくはちゃっちゃっと下記サイトからサンプルをとって試していただける方、どうかレスをお願いします。
著書内ではこれでどうだというくらい日本語対策をうたっているのに、全サンプルがNGとは、あまりに不思議な現象で、とても困っています。
どうかよろしくお願いします。

『Head First PHP & MySQL――頭とからだで覚えるWebアプリケーション開発の基本』
Lynn Beighley, Michael Morrison 著、佐藤 嘉一 訳
2010年03月 発行
672ページ
ISBN978-4-87311-444-6

http://www.oreilly.co.jp/books/9784873114446/
関連ファイル ー サンプルコード
に本の中で使われている全てのサンプルが入っています。

よろしくです。
下記のphpの本を参考にプログラムを勉強しているのですが、
サンプルコード(完成品)の日本語部分(DBがソースの日本語部分全て)がすべて文字化けしてしまいます。
この本は文字化け対策を強みにした本なのですが、実際のサンプルコードがこんな状態なので非常に困っています。
例えば、表示サイトページ内に3時間というデータが表示される予定だとすると、3??(ハテナマーク)のように表示されます。
ちなみに文字化け後、ブラウザ、DB、phpの文字コード設定はutf8統一であることは確認しま...続きを読む

Aベストアンサー

表示させるだけじゃねーじゃん。

確かにデフォルトだと文字化けした。
でも文字化け回避できた。

--------------------------------
// Connect to the database
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
mysqli_set_charset($dbc, "utf8");// ←追加

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

Qホームページや書籍などのサンプルコードは動かないものばかりでしょうか?

ホームページや書籍などのサンプルコードを試して動かしてみても、動かないサンプルコードばかりだと思いますが、同じことを考えている人はいらっしゃいますか?

何か…ホームページや書籍などのサンプルコードが動かないということは、そのサンプルコード自体の問題というよりは作者の問題と思いますが…。なぜなら、1件のホームページや1冊の書籍で、このサンプルコードが動かなければ別のサンプルコードが動かない可能性が高いです。逆にこのサンプルコードがちゃんと動くということは、他のサンプルコードも動く可能性が高い。経験談で感じた限りです。

要するには作者の解説力次第になりますと思いますが、どうでしょうか?どんな簡単な言語でも解説力がなければ取っ付きにくく、どんな難しい言語でも解説力があれば取っ付きやすいものでしょうか?

何か解決法とかありますでしょうか?ご回答をお願いします。

Aベストアンサー

ちょっと抽象的かも、です。

>ホームページや書籍などのサンプルコードが動かないということは、そのサンプルコード自体の問題というよりは作者の問題と思いますが…。

それは「あり得ます」。
ただし、その前に自分の環境をチェックした方がいいでしょう。
ヴァージョン違い、なんてのは他のお方が仰ってる通りなんですが、他にも原因は色々と考えられると思います。
基本的に、一概にプログラミング言語と言っても、

1.提供元が一つしか無いもの
2.公式規格が制定されているもの

の2種類があります。
例えばC#なんかはMicrosoftしか提供元が無い言語がありますし、最近流行りのスクリプト言語系(Python、Ruby等)も提供元が一つしかありません。こう言う場合はヴァージョン違いだと動かない可能性がありますね。他のお方が仰っているように、使用してる言語のヴァージョンをチェックした方がいいでしょう。
じゃあ、2番なら安心か、と言うとそう言う事もないのです。
例えばC言語なんかは公式規格があったりしますが、かと言って、通常は「公式規格に則って」作っただけの言語なんてのも無くって、大体その提供側独特の「拡張ライブラリ」が入ってたりするんです。
つまり、A社が提供した「拡張ライブラリ」を利用したプログラムを「B社製の」一応公式規格に則った言語で書いても動かない場合があるんです。「拡張ライブラリ」自体は独特なんで、B社が同じモノを付けている、とは限りません。そう言う場合があるんですね。
まあ、そう言う事が(しばしば)生じるんで、何らかのサイト/参考書を利用してプログラムの勉強をする場合は、なるたけその筆者と「同じ環境を」備えるようにした方がいいです。作成者自身も「全部の環境を」試せるワケではない、と言う事を最初に納得しておくべきだと思います。

>要するには作者の解説力次第になりますと思いますが、どうでしょうか?
>どんな簡単な言語でも解説力がなければ取っ付きにくく、どんな難しい言語でも解説力があれば取っ付きやすいものでしょうか?

一理あるとは思います。
が、同時に「言語の性質」ってのはありますね。解説力があってもそれを埋める事は難しいでしょう。

これ言って良いのか悪いのか分かりませんが、原則、書籍を購入して勉強する場合は「定番で」「評価の高い」書籍を選んだ方が、万能では無いですけど「失敗する確率は低い」とは思います。やっぱ校正とかそのテのノウハウを蓄積してる「実績ある」出版社の本を選んだ方がいいですね。
敢えて言いますが、最近「ネットで発表」→「書籍化」と言うのが流行りになっていますが、ホームページを作れても書籍が作れるのか、と言うとこれはまた別の話なんですね。
新興のネット関係での出版社なんかがプログラミング言語の本をサイトの作者の持ち込みで「安く」出版してるケースが見られますが、単なるブログ系の本だったらいざ知らず、このテの技術系の本の場合、「校正を全く行わない」「誤字脱字が多い」「索引でデタラメで役に立たない」状態で出版していて、「安い」だけで買うと、結局役に立たないんで痛い目見ます(敢えて会社名は伏せておきますがそう言う実例があるのです)。
ですから、サイトで勉強するなら構いませんが、書籍を買って勉強する場合は、少々値段が高くでも「定番商品」の方が結果安上がりです。書評に関しては大体のトコamazonで見れますし(もっともamazonは否定的な意見は載せたがらない方針ですが)、何種類か評判が良い書籍をメモっておいて本屋で現物を見た後購入した方が良いでしょう。または、評判書籍を取りあえず図書館で借りて読んでみる、とか。
出版社もすべて同じなワケではなく、「一回刷っちゃったらあとは絶版でイイや」程度で考えて粗製本作ってるケースも確かに存在するんで、そこまで行くと、確かに仰る通りかもな、とは思います。

ちょっと抽象的かも、です。

>ホームページや書籍などのサンプルコードが動かないということは、そのサンプルコード自体の問題というよりは作者の問題と思いますが…。

それは「あり得ます」。
ただし、その前に自分の環境をチェックした方がいいでしょう。
ヴァージョン違い、なんてのは他のお方が仰ってる通りなんですが、他にも原因は色々と考えられると思います。
基本的に、一概にプログラミング言語と言っても、

1.提供元が一つしか無いもの
2.公式規格が制定されているもの

の2種類があり...続きを読む

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ランキング