このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

Perl CGI のデバッグ方法

発言者:重松修
( Date Thursday, October 25, 2001 16:09:06 )


こちらで尋ねて良いものやら、ちょっと違う気もするのですが、

http://tackysroom.com/ で配布されている、日記帳をインストールしています。
ところが、500 Internal Server Error になります。

状態は、
[shige@ganymede cgi-bin]$ ls -al
total 100
drwxrwxrwx    2 shige    shige        4096 Oct 25 16:01 ./
drwxr-xr-x    9 shige    shige        4096 Oct 25 15:14 ../
-rw-rw-r--    1 shige    shige         956 Oct 18  1999 b_102.gif
-rw-rw-r--    1 shige    shige         954 Oct 18  1999 b_103.gif
-rwxr-xr-x    1 shige    shige       17650 Feb 10  1998 jcode.pl*
-rwxr-xr-x    1 shige    shige       58041 Oct 25 15:16 tackynote.cgi*
-rw-rw-rw-    1 shige    shige           0 Feb  1  2000 tackynote.txt
-rw-rw-rw-    1 shige    shige           0 Dec 16  2000 tackynote_old.txt

となっていますので、permission の設定ミスではないと思います。

ちなみに、

[shige@ganymede cgi-bin]$ which perl
/usr/bin/perl

に基づいて、tackynote.cgi の一行目の perl の path は修正しています。

コマンドラインで、./tackynote.cgi を実行すると、

[shige@ganymede cgi-bin]$ ./tackynote.cgi
bash: ./tackynote.cgi: No such file or directory

と怒られてしまいます。

Apache 自体の設定は、同じディレクトリに単純な perl script を配置して、期待の動作をすることで
確認済みで、間違いはないと思われます。

httpd の error_log には、

[Thu Oct 25 15:49:29 2001] [error] (2)No such file or directory: exec of /home/shige/public_html/cgi-bin/tackynote.cgi failed
[Thu Oct 25 15:49:29 2001] [error] [client 210.160.159.246] Premature end of script headers: /home/shige/public_html/cgi-bin/tackynote.cgi

とあります。まあ、cosole で動かないのと同じ理由で動かないようです。
# perl tackynote.cgi とすれば、console でキチンと動作します。

http://tackysroom.com/yokuaru.htm の FAQ も目を通しましたが、解決のヒントは見あたりませんでした。

思いっきり初歩的な見落としだと思いますが、ヒント、デバッグの方法をご教授いただければ幸いです。

環境:
VineLinux 2.1.5 ftp
Apache 1.3.20 (tar ball から install)
Perl version 5.005_03 built for i386-linux

重松修 さんからのコメント
( Thursday, October 25, 2001 16:17:28 )

たびたびすみません。
該当ファイルですが、
http://www.ravi.ne.jp/~shige/cgi-bin/tackeynote.txt
で見られるようにしました。
文字コードは、SJIS、改行コードは CR LF のようです。

[shige@ganymede cgi-bin]$ head -1 tackynote.cgi | od -t x1
0000000 23 21 2f 75 73 72 2f 62 69 6e 2f 70 65 72 6c 0d
0000020 0a
0000021

qkc で LF のみに変換してみたのですが、(当然?) 関係ないようでした。

竹内 さんからのコメント
( Thursday, October 25, 2001 16:58:47 )

> http://www.ravi.ne.jp/~shige/cgi-bin/tackeynote.txt

Not Foundといわれてしまいますね。
もしかして、微妙ににディレクトリが違うということは無いでしょうか...?

Apacheの最新版をtar ballからインストールされているようですので、
デフォルトの
/home/httpd/cgi-bin/
と
/var/www/cgi-bin/
の違いとか...?

# ん? Vine2.1.5のApacheのドキュメントルートは、デフォルト /var/www/html/でしたっけ?
# すみません、推測です。

Junnama さんからのコメント
( Thursday, October 25, 2001 17:00:20 )

> [shige@ganymede cgi-bin]$ ./tackynote.cgi
>  bash: ./tackynote.cgi: No such file or directory

こいつ(./tackynote.cgi)が見つからないということですから、Scriptの中で
「./tackynote.cgi」が記述してある行があればそこが怪しいのではないでしょ
うか。

環境にもよりますが、見る限り同じ階層に各ファイルがありますから、ファイル
の指定をしている部分の「./」を削除して、単に「tackynote.cgi」とされては
いかがでしょうか?

Junnama さんからのコメント
( Thursday, October 25, 2001 17:08:09 )

> 「./」を削除して、単に「tackynote.cgi」とされては

又はフルパス(/home/shige/public_html/cgi-bin/tackynote.cgi)で指定する
とか...

今井真人 さんからのコメント
( Thursday, October 25, 2001 17:08:48 )

この当りが参考になりませんか?
http://japache.infoscience.co.jp/japache/docs/misc/FAQ.html#premature-script-headers

また、エラーを出しているのがsuEXEC機能に該当するなら、
http://httpd.apache.org/docs/suexec.html
や
/var/log/apache/suexec.log
を見ると、よろしいでしょう。

今井真人 さんからのコメント
( Thursday, October 25, 2001 17:25:18 )

suEXECは、パーミッションやオーナー名、グループ名など、
CGI設置上位ディレクトリを含めて、調査して問題があれ
ば残らず500 Internal Server Errorを表示して、error.logでは
Premature-script-headersエラーにしてしまうので、
扱いにくい存在です。

セキュリティ上はなくてはならないんだけど。

広瀬@明治大学 さんからのコメント
( Friday, October 26, 2001 09:51:08 )

問題のtackynote.cgiの先頭行には

#!/usr/bin/perl

だけですか?

perlの後ろに何か制御文字のような物が入っていませんか?ここに
制御文字( ^M とか)が入っていると、./tackynote.cgiとかコマンド
ラインで実行しようとすると、おっしゃる通りのNo such file or .....
のエラーになります。

重松修 さんからのコメント
( Friday, October 26, 2001 10:47:48 )

みなさん、コメントありがとうございます。

広瀬さん、

>問題のtackynote.cgiの先頭行には
>
>#!/usr/bin/perl
>
>だけですか?

od のダンプに示したとおり、CR   LF ですので、UNIX 的には不要な ^M が含まれているはずです。
qkc に食わせて、LF のみにしたら、動きました。m(__)m
# 一度確認したはずなのに。。。

あまりに基本的なことでお騒がせしまして、申し訳ありませんでした。