CGI(Perl)からPerlを起動するには?

[上に] [前に] [次に]
むら 2000/01/20(木) 16:37:28
サーバ環境
 NT 4.0 SP5
 IIS4.0
 perl 5.003_07(perl for win32)
クライアント環境
 win95 ie4.0 sp2 / nn4.6

上記の環境で、次の様なcgiを動かしたいのです。
-----------------------------------
open(IN,"c:/perl/bin/perl.exe a.cgi |");
while(<IN>) { print; }
close(IN);
-----------------------------------
a.plの中身は、htmlドキュメントを出力するperlスクリプトです。

これを、サーバ上のコマンドプロンプトで実行すると、正常に動作するのですが、
クライアントからcgiとして実行すると動作してくれません。

他にも、
$data=`c:/perl/bin/perl.exe a.cgi`;
print $data;
を使ってみましたが、結果は同じでした。

やりたいことは、共通のa.cgiをあっちこっちのcgiから(サブルーチンのように)使用したい、
なおかつ、a.cgiを単独でも使用したいので、サブルーチンはあまり使用したくないと思っています。
(単独で使用する時は、それを起動する為の別のcgiが必要でそれはを作りたくない。)

サブルーチンを使えば、この問題は回避出来るのですが、
どうして動かないのか、とても気になります。
どなたか原因(と出来れば対処も)教えて下さい。

必要な情報、または、こんな調査はした?ということがありましたら仰って下さい。

ふじ 2000/01/20(木) 21:16:03
IISのCGIだと、スクリプトのある場所がカレントディレクトリにならない
ことがあったような。

> open(IN,"c:/perl/bin/perl.exe a.cgi |");
open(IN,"c:/perl/bin/perl.exe c:/hoge/fuga/a.cgi |");
みたいにして、スクリプトもフルパスで書いてみては。

むら 2000/01/20(木) 21:59:17
ふじさん、ありがとうございます。
試してみました。しかし、うまくいきませんでした。
以下の様なソースで実験しています。
起動するcgi
---------------------------------
chdir("c:/hoge/fuga");
print "Content-type: text/html\n";
print "\n";
print "<html><head></head><body><pre>\n";
print "start\n";
open(IN,"c:/perl/bin/perl.exe c:/hoge/fuga/a.cgi |");
while(<IN>) { print; }
close(IN);
print "end\n";
print "</pre></body></html>\n";
------------------------------------------
呼ばれるcgi(a.cgi)
---------------------
print "aaaaaa";
---------------------
これをcgiとして実行すると
-------
start

end
------
で、aaaaaaが出力されません。
ちなみに、どちらのcgiも同じフォルダに格納しています。

なぜなんでしょう。コマンドプロンプトでは正常に動作しているのに(;_;)

ふじ 2000/01/20(木) 23:11:05
取りあえず、

open(IN,"c:/perl/bin/perl.exe c:/hoge/fuga/a.cgi |") or print "can't open $!";

みたいにして、エラーが出てないか確認しましょう。

むら 2000/01/21(金) 09:28:40
> open(IN,"c:/perl/bin/perl.exe c:/hoge/fuga/a.cgi |") or print "can't open $!";

試してみましたが、cgiとして実行した時は、a.cgiの結果も、can't openも出力されませんでした。
(コマンドプロンプトでは、a.cgiの結果が出力されます)

・・・ということは、この行は実行されていないってこと??
う〜む。

むら 2000/01/21(金) 09:40:19
> open(IN,"c:/perl/bin/perl.exe c:/hoge/fuga/a.cgi |") or print "can't open $!";

試してみましたが、cgiとして実行した時は、a.cgiの結果も、can't openも出力されませんでした。
(コマンドプロンプトでは、a.cgiの結果が出力されます)

・・・ということは、この行は実行されていないってこと??
う〜む。

無責任官庁 2000/01/21(金) 12:02:43
ちょっとハズしてるかもしれませんけど…

インターネットサービスマネージャの、
「アプリケーションの構成」の「アプリケーションのマッピング」
で、CGI(Perl)の関連付けをしてると思いますけども、
そこのPerlの設定の所で「ファイルの存在を確認する」のチェックは付いてますか?

一度これでやってみては?

ファイルの存在・アクセス権などで異常があれば、
エラーメッセージが出るようになります。多分。(^-^;

>これを、サーバ上のコマンドプロンプトで実行すると、正常に動作するのですが、
>クライアントからcgiとして実行すると動作してくれません。

ということなので、アクセス権ってコトは無いでしょうか?
クライアントから…は、匿名ではなく認証を経てアドミニ等でログインしているのでしょうか?
>サーバ上のコマンドプロンプトで実行すると
は、アドミニで、
>クライアントからcgiとして実行
は、匿名アカウントだったり…だと、アクセス権によっては動作に問題出るような気が…

バーチャルヒューマン [E-Mail] 2000/01/21(金) 13:44:40
Webサーバは、IISではないので、同じかは分かりませんが。
#WinNT4.0/apache for WIN32/perl 5.005_03

ちなみに
WinNTでも、AN-HTTPサーバでは正常に動作します。
また、Win98でも正常に動作します。

おそらくは、Perl for win は基本的にconsoleベース?
なので、open(IN,"c:/perl/bin/perl.exe c:/hoge/fuga/a.cgi |");
のように、パイプ処理する場合に、子processの標準OUTがconsole
のままで、WEB connection(HTTP)とI/Fされないのが根本原因のようです。
# a.cgiにsleep(10)とか入れるとDOS窓が...?

解決方法は、mainのscriptで適当なtemporary fileを作りそれを
介すという方法ですかね。
#temporary fileの名前をユニークにしなくてはいけませんが。

むら 2000/01/22(土) 15:50:35
[[解決]]
> で、CGI(Perl)の関連付けをしてると思いますけども、
> そこのPerlの設定の所で「ファイルの存在を確認する」のチェックは付いてますか?

試してみましたが、結果に変化はありませんでした。

> パイプ処理する場合に、子processの標準OUTがconsoleのままで、WEB connection(HTTP)とI/Fされないのが根本原因のようです。

そういうことですか・・・

> 解決方法は、mainのscriptで適当なtemporary fileを作りそれを介すという方法ですかね。

`c:/perl/bin/perl.exe c:/hoge/fuga/a.cgi >work.txt`;
open(IN,"work.txt");

ということですね。仰る通り、ファイル名をユニークにしなくてはならないですね。

結論としては、私の環境では、open(IN,"c:/perl/bin/perl.exe c:/hoge/fuga/a.cgi |");は出来ない、ということですね。

これから、ファイルを介す方法と、サブルーチンを使うのと、どっちがいいか、という判断をします。

みなさま、ありがとうございました。

[上に] [前に] [次に]