• 締切済み

IIS+ActivePerl+Cygwinにて

Perlで open(STDOUT, '| gzip'); としてhttpヘッダ以降を圧縮して出力することを、以前ここで教えてもらいました。 ここで問題なのですが、プロセスが完了してもgzipのごみプロセスが残りっぱなしなのです。 再表示するたびにごみが増えていき、だんだん不安定になっていきます。 最後に close(STDOUT); してもgzipは終了しないようです。 これを終了する手段はないものでしょうか? IISでなくてもUnix+Apacheでも同じようなことが起こるようなら、サーバーにアップロードできなそうです。

  • CGI
  • 回答数1
  • ありがとう数1

みんなの回答

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.1

perlはよく知りませんが,awkの経験からすると、 close()の引数が間違っているように思えます。 STDOUTだけでなくパイプとgzipが組になっているので、 それ全体を指定する必要があって、 perlでの正しい記述はしりませんが、 close(STDOUT,'| gzip');のようになると思います。

haporun
質問者

お礼

open(ハンドル, ファイル名又はコマンド) という構文なので、STDOUTはハンドル、'|gzip' はコマンドなのです~。 closeは第1引数にファイルハンドルを取るので、第2引数はないようです。 awkだとそのような記述ができるのでしょうか? awkもすこしかじりましたが、あまりマニアックなことは知らないので・・・。 ご指摘ありがとうございました。

関連するQ&A

  • IIS7.0でPerlのCGIにてバックグラウンド

    はじめまして、初心者の質問で恐縮ですが、以下の点を教えて欲しいです。 IIS7.0のWebサーバで、CGIプログラムをPerlで作っているのですが、forkした子プロセス で時間のかかるバックグラウンド処理を行って、親プロセスでWebブラウザに返す処理を しようとしていますがうまくいきません。重たい処理が終了するまでWebブラウザに応答 されません。(子プロセスの終了が終わるまで、親プロセスのHTML表示処理がWebブラ ウザに返答されません)通常、子プロセスでclose(STDOUT)で親プロセスのHTMLの 表示処理が出来ると思っていますが。。。 どのようにすれば良いか教えてもらえると幸いです。以下は参考のプログラムです。 よろしくお願いします。 $|=0; if ( $pid = fork){ #親プロセス &disp_html(); #HTMLを表示させるプログラム wait; }elsif (defined $pid) {  #子プロセス close(STDIN); close(STDOUT); close(STDERR); &heaby_prog(); #重たい時間のかかる処理 exit 0; } else { die "Can't fork: $\n"; } よろしくお願いします。

  • apacheとIISについて

    会社でWEBサーバーを立ち上げる予定なのですが、 UNIX系OSでapacheを利用する場合とWindowsでIISを利用する場合だと、 何か大きな違いとか機能面での特異性、優位性とかってあるんでしょうか? apacheでいいと思っていたのですが、 最近はIISのシェアも随分伸びてきているようなので気になりました。 (IISのシェアが伸びたのは何か利点があったからでしょうか?) 個人的には前者はオープンソースなのでコストがかからない、ドキュメント類が豊富、 後者は運用管理ツールが豊富、GUIで管理できる、慣れているWindowsで操作できるくらいかなと思っているのですが・・・。 導入の参考にしたいのでよろしくご教授願います。

  • IISでCGIとしてのPerlが動かない

    Win2K ProにてIISでローカルサーバーでサーバーサイドスクリプトの勉強中です。 ASPは標準でついているので、PerlとPHPを組み込みました。 PHPは内部プロセス型ではなく、CGIバージョンですが、正常動作しました。 もちろんASPも。 それで問題なのですが、Perlがどうしても動きません。 PHPと同じように実行ファイルのパスや拡張子の設定はできているはずです。 しかし、いつまでたっても出力が出ず、2分くらいたってCGIタイムアウトとなってしまいます。 PerlにはActive PerlとCygwin付属のPerl両方試しましたが、タイムアウトです。 ファイルをコンソール上で実行してみましたが、Active PerlもCygwinのPerlも、期待通りの出力がなされています。 ちなみに、shファイルをCygwinのbashに関連付けて、実行させましたが、コンソール上での出力とはうらはらに、ブラウザ上ではやはりタイムアウトとなりました。 PerlのソースはいずれもほかのところのApacheでは動いているものです。 httpヘッダも正常です。 ソースの文字コードは英語のみ、EUC、改行コードcr+lf、lfのみなど、いろいろ試しましたがダメでした。 なにが原因なのでしょう。 IISを使っている方、アドバイスお願いします。

  • close(STDOUT)するとCGIが終了する。

    Windows2000+Apache2.2+ActivePerlでCGIを作っています。 CGIで時間のかかる処理を行いたいので、以下のような処理を行いました。 print "Content-type: ~ ~ブラウザに返す文字列を標準出力へ~ close(STDOUT); ~時間のかかる処理~ ところが、「時間のかかる処理」の部分は実行されず、どうやらSTDOUTをクローズしたことにより、 ApacheによってCGIが終了させられてしまうようです。 ネットなどで見るかぎり、UNIX系のサーバーではよく行われる方法のようなのですが、Windowsでの実装になにか違いがあるのでしょうか? また、Windowsサーバーでこのようにブラウザに処理を戻しつつ、時間のかかる処理を行いたい場合にはどうすればよいのでしょうか?

    • ベストアンサー
    • CGI
  • IISとXAMPPのApacheの環境設定

    マイクロソフトのSilverlight 4を動かしているのですが、そこで動いているIIS(Internet Information Services)が原因と思われるのですが、オープンソースのXAMPP上で動いているApacheが起動できなくなってしまいました。Silverlightではメディアのストリーミングとか問題なく行えるようになったのですが、VWD(Visual Web Developer)のデバッグを中止したり、VWDのプロジェクトを終了したり、PC(Windows Vista)を再起動してもApacheが起動しなくなってしまいました。 エラー情報として、 モジュールIIS Web Core 通知MapRequestHandler ハンドラStaticFile エラーコード0x80070002 が出ています。 ここからは推測なのですが、 IISが、http://localhost:6413/ でポート番号が6413に割り振られているようなのですが、これが常にいつも動いてしまっているということなのでしょうか? PCを再起動しても、Apacheの http://localhost:80/ のポート80番地に接続されないようなのです。IISの方もApacheのようにVWDを立ち上げて起動した時だけに使えるようにはできないものなのでしょうか?(要はApacheを起動したい時には、IISが止まっていてほしいのです。) Webサーバーとして、ひとつのPC上で、ApacheとIISの両方を使われている方は多いと思うのですが、通常どのようにして使い分けられているのか、御経験のある方は御教示願えたらと思います。 よろしくお願い致します。

  • system で実行したプログラムの標準出力を変数で受け取りたい

    実行結果を標準出力に出力する cプログラム A があります。 perl から system を利用して A 呼び出し、その実行結果を perl で加工する仕組みを考えています。 今のところ、標準出力を一旦変更して、テンポラリのファイルに出力させ、再度そのファイルをオープンして perl で利用するという形で何とか実現できています。 open (SAVESTDOUT, ">&STDOUT") or die "..."; #(1) open (STDOUT, ">$tempFile") or die "..."; #(2) system "A"; #(3) close(STDOUT) or die "..."; #(4) open(STDOUT, ">&SAVESTDOUT") or die "..."; #(5) という感じです。 一旦テンポラリーのファイルを介するところがスマートでないので、直接変数に標準出力結果を落したいです。 (1) そのまま (2) 標準出力を perl の変数に変更 (3) そのまま (4) なし (5) そのまま といった感じで実現したい(もちろんより良い解法があれば尚宜しいです)のですが、可能でしょうか? ご教授ください。宜しくお願いします。

    • ベストアンサー
    • Perl
  • iis+cgiでmultipart/form-data送信がうまくいかない

    これまでLinux+Perl/CGIで構築していたWEBサーバをIIS+Perl/CGIに移す必要が生じ、新規にIISによるWEBサーバを構築しました。 一気にコンテンツを移動してもハマるだけだと考え、まずは簡単なコードを記述しCGIが動作するかどうかテストしています。 POSTによるinput type=textのデータ表示まではうまく行きましたが、ファイルアップロードのところで詰まりました。 IIS(Windows)によるWEBサーバの構築は初めてで、何が問題なのかサッパリわかりません。 どなたか問題点あるいはどこをチェックすれば良いかご指摘いただけませんでしょうか。 ●やった事 PerlにてPOSTを利用しmultipart/form-dataにてファイルをアップロードするシンプルなコードを書き、第一段階としてMIMEエンコードされたものをブラウザ上に表示するしようとしてみた。 コードは最下方の通り。 ●症状 送信を実行してもアップロード中のまま(ウィンドウマークが動き続けている)で、IISに設定してある10分程のタイムアウト時間を過ぎて終了してしまう。 TXT、XLS、DOCなどファイル種を変えて試しても全く同じ症状。 ●環境:Windows2000ServerSP4 IIS5.0 Perl5.8.8 *******アップロード画面****** <HTML> <HEAD> <TITILE>ファイルのアップロード</TITLE> </HEAD> <BODY> <FORM ACTION="/cgi-bin/upload.cgi" ENCTYPE="multipart/form-data" METHOD="POST"> ファイル: <INPUT TYPE="file" NAME="File" SIZE="32"><BR> <INPUT TYPE="submit" VALUE="送信"> </FORM> </BODY> </HTML> **********ここまで*********** *******CGI******************* #!/perl/bin/perl read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); print "Content-type: text/html\n"; print "\n"; print "<HTML>\n"; print "<HEAD>\n"; print "<TITLE>test</TITLE>\n"; print "</HEAD>\n"; print "<BODY BGCOLOR=\"#ffffff\">\n"; print "$buffer"; print "</BODY>\n"; print "</HTML>\n"; exit; ********ここまで***********************

    • ベストアンサー
    • CGI
  • 2003サーバの『規定のwebサイト』の開始が出来ない

    IIS6.0において、『規定のwebサイト』が停止状態から 開始できなくなっています。 『プロセスは他のプロセスが使用中です。』 という、エラーか帰ってきます。 Apache、PHP、Perlをインストールしているので、 ひょっとしたら、ApacheとIISはどちらかでよいとも聞いたこともあるので、 c:\windows\php.iniかd:\Apache\conf\httpd.conf への設定がおかしくなっている可能性があるでしょうか? インストールに関してはこちらを参考にしています。 ttp://y-kit.jp/saba/ また、2003サーバにおけるPHP,Apache,Perl等のインストールについて記載のあるURLをお願いします。 階層は D:\をすべてweb用に割り当てて、 d: ┣Apache ┣Inetpub┳wwwroot┳index.html ┃    ┃ ┣cgi-bin(エリアス) ┃    ┗cgi-bin(実際のデータ)  ┣Logfiles ┣php━php.exe ┣WUTemp ┗user━local┳bin━perl.exe        ┃・・・        ┃・・・        ┃・・・ となっています。 よろしくお願いします。

  • Perl はOSによって動作が違ったりするのか?

    お世話になります。 PerlでCGIを作成しようと思うのですが、Webサーバ側の環境がWindows2000、Linux、UNIXなど、OSによって動作が違ったりするのでしょうか? と、いいますのも、WebサーバはUNIXでSun ONE WebServerなのですが、 PerlのプログラミングはWindowsで、テストは、Windows 2000+ApacheまたはIISなどでしようと考えています。 Windowsの環境で作成、テストしたPerlプログラムを、 UNIXのSun ONE WebServerにアップした際、 不具合なく動作するかどうかが心配なのです。 以上、ご教授よろしくお願いします。

    • ベストアンサー
    • Perl
  • バックグラウンド処理をforkする意味

    初歩的な質問かもしれませんが… デーモンなどではなく、あくまでも通常のCGIスクリプトにおいて、何か重い処理をさせる場合は、STDOUTをcloseして処理はforkで生成した子プロセスにさせる、するとユーザーを待たせることなく(ブラウザをビジーから開放し)処理はバックグラウンドで実行される、という方法がよく見られるのですが、素朴な疑問があります。 ブラウザを開放させるにはSTDOUTをcloseすれば良い、 では、なぜ処理を子プロセスにさせなければならない? という点です。 一応、以下のような簡単なコードで試してみました。 ----------------- use Date::Format; my $log_file = 'hogehoge/test.log'; my $start = time2str('%m-%d %T', time); print "Content-Type: text/plain\n\n"; print "start:$start"; close(STDOUT); &heavy_exe($start); exit; sub heavy_exe { my $start = $_[0]; sleep(15); my $now = time2str('%m-%d %T', time); open(LOG, ">>$log_file") or &error('cant_open'); print LOG "$start\t$now\n"; close(LOG); } ----------------- 実行してみると、ブラウザはすぐさま開放される(読み込み完了になる)のと、15秒後にロギングも問題なく行われ、また本当に開放されていることを確認するために表示から15秒以内にリロードさせても、問題なく2プロセスとも動いていました。 以上を見る限りでは、forkなんてしなくても単にブラウザを開放するだけでいい、STDOUTをcloseするだけでバックグラウンド処理されると思うのですが、どうなのでしょう。 あるいは何か環境に依存した、子プロセスにさせなければならない理由などがあるのでしょうか。 よろしくお願いいたします。

    • 締切済み
    • CGI

専門家に質問してみよう