ブラウザ上に何かを書き出すような物ではなく、約1時間に1度実行し、指定ディレクトリを読み、ファイルの名前と更新日などを別ファイルに出力するという物です。
無事に動いているように見えるのですが(必要なデータも取れるので)error.logを見ると「Premature end of script headers:〜」というエラーが必ず出力されます。
どういうものが理由として考えられますか?
Windowsで作成して、Unix(Linux とか)に改行コード
そのままで送信したりしていませんか?(Samba でコピーとか FTP のバイナリーモードでとか)。
Unix で CR+LF の改行コードのスクリプトを食わせると、
件のエラーが出るかと思います。
こちらのページの Linux Tipsに Premature end of script headers の解決方法というのがあります
Perlに与える改行コードの問題が指摘されていますね
/usr/bin/perlの直後にCRLFがないですか?
perl -cw での文法チェックもしてみましたか?
perl -cwでチェックすると
「Backslash found where operator expected at - line 2, near ”〜”」というのが出ます。
「〜」の中身は多分cgiの方ではなく、ディレクトリの中身が表示されているようなのですが…。
http://sagittarius.dip.jp/~toshi/premature.html
Premature end of script headers
Premature end of script headersの解決法-超簡易版
まず、もっとも簡単なCGIを動かしてみてください(パーミッション変更忘れずに)
例
#! /usr/bin/perl
#↑これは各自の環境に合わせてください
print ”Content-type:text/html¥n¥n”;
print ”test”;
これで動かなかったら以下の項目を試してみてください(責任はもてません)
A.あなたがサーバ管理者の場合(B.の借りてる場合も参照)
1、改行コードが誤認識される
なんか、こういう事態が発生することがあるみたいです。(うちもそうです)
perl script内の一行目に
#! /usr/bin/perl --
を付けるとなぜか直る。
※FTP転送で相手のOS自動認識がうまくいかないとなるとの報告もありますが、うちではなぜかLinux上で作成した物でもこれをつけないと動かないです^^
2、perlのパス表記が間違ってる。
てきとーにシンボリックリンクでも張って記述が違っても動くようにしてあげましょう。
3、その他
安定稼動しているApache1.3系に乗り換えましょう(私もそうしました。1の解決法も併用)
B.あなたがサーバを借りている場合
1、ファイル転送モードが間違っている
Binaryモードで転送すると動かないのでASCIIモードで転送してください。
2、文字コード変換がうまくいってない
通常FTPソフトは文字コードを自動変換してくれるらしいのですが、うまく言ってない場合もあるとかないとか。
サーバがLinux系の場合はEUCとかにしてあげるとよいみたいです。
3、改行コードが誤認識される
2の問題と関連するみたいですが、なんか、こういう事態が発生することがあるみたいです。(うちもそうです)
perl script内の一行目に
#! /usr/bin/perl --
を付けるとなぜか直る。
4、perlのパス表記が間違ってる
パスを再確認しましょう。SSHなどでログインできる場合は
%which perl
などでパスを確認できるかも。わかんなかったら管理者に聞きましょう。
5、その他(おまじないレベル?) print ”Content-type:text/html¥n¥n”
とかの部分の「¥n」をたくさん増やしてみる。
直ったとの報告あり
私の知ってるのはこんな程度です。ちなみに私のはApache2.0系ので全然動かず(mod_perlがおかしかったので直してもhtmlがみれなかったりとか)1.3系に入れなおして1の解決法で直しました。
ちなみに、Premature end of script headersは何か特定の問題を示すに至るエラーではないようです。何かしらの問題で、ちゃんと結果が出力されないときに出るという感じみたいです。
転送モード、文字コード、#!/usr/local/bin/perl -、
全部やってみましたがダメみたいです。
(content-type〜はこのcgi中には使用していません。)
データが出力されていないのならまだいいんですけど、
出力されてなおかつエラーが出るので困っています。(この調子なら1日に24回はエラーを吐くので…。)
”CGIからhttpdに返されたヘッダーが正常に終了していない”という意味ですので、「ブラウザ上に何かを書き出すような物ではなく...」といのが原因ではないでしょうか?
「1時間に1度実行し...」ということは、cgiがヘッダを返さずにずっとsleepしているということですか?
前回の処理日時を記録するファイルを作っており、それを読み出して、異なっていたら処理をするというものです。htmlにSSIを貼っていて(SSIは動くようにしています)例えば、前回の処理日時が「2004/04/23 09」として記録されていたなら、これと同じ時間にページが読み込まれた場合はデータ取得の処理をせず、10時台になったら処理をし、日時登録のファイルを書き換えます。
(ですので、「約1時間に1度実行」です。)
エラーは、データの書き換えが起こったときにのみ出力され、データの書き換えが起こらないときには出力されません。
http://japache.infoscience.co.jp/japache/docs/misc/FAQ.html#prem...
Apache Server Frequently Asked Questions
14. ”早すぎるスクリプトヘッダのエンド” で CGI が失敗することは、何を意味していますか?”?
を見てください
http://www11.plala.or.jp/stoyama/sr1linux/rhfaq.html#A13
FAQ for Redhat Linux
1.cgiスクリプトの改行コードが正しくない.
サーバー上で cat -v ファイル名 として,行末に ^M がついている場合がこのケースです.
DOSの改行コードで作成されたcgiファイルをftpで転送する場合,RedHat-8以降で標準の vsftpd の初期設定の問題から,ASCIIモードで転送したつもりでも,binary モードで転送されてしまいます.
/etc/vsftpd/vsftpd.conf の以下の箇所をアンコメントすれば,ASCII転送ができるようになります.
#ascii_upload_enable=YES
#ascii_download_enable=YES
2.ユーザーディレクトリの ~/public_html/ より下の階層でcgiを動かそうとしている.
suexec が原因です./usr/sbin/suexec を削除するか,リネームすれば解消します.
suexecがあやしそうな気がします。レンタルサーバの身でsuexecをどうこうできるのか解らないので、とりあえず調べてみるとして、次の方の回答を見させてください。
2つ目の回答に対してで「Backslash found where
operator expected at - line 2, near ”〜”」という
のが出ると書かれていますが、もしかして、ディレクト
リ・ファイルの区切り文字か何かに「¥」を使っていませ
んか?
「Premature end of script headers」の直接的な原因
は、上記メッセージ(Backslash〜)が CGI の結果とし
て送られてしまっているためだと思われます。
¥は使ってないんですよね。
ただ、書かれている「〜」の内容は、cgiの内容ではなく、読み込んでいるディレクトリの中にあるファイルの内容なんです。(そのファイルの中にあるということでしょうか?)
ちなみに、perl -cwを何度も繰り返すと、
lineに書かれている行数が1つずつ増えます。(最初は1、次は2)
http://www.namazu.org/~tsuchiya/perl/info/perl-ja_105.html#SEC10...
The Perl5 Manual - デバッグ
「Backslash 〜」の後ろについてくる内容がファイルの
内容となると、CGI プログラムがそのファイルの中身を
スクリプトとして解釈しようとしているように思われま
す。
こうなると、実際にコードを見て見ないとなんとも言え
ませんが、perl -d などでデバッグしてみるしかないと
思います。
デバッグで無事解決しました。ありがとうございました。
Windowsで作ってますが、NextFTPでアップするときに改行コードは自動変更していますので、これではないような気がします。(試しに手動で改行コードを変えてみましたが、それでも同じくエラーが出ます。)