トラブルシューティング

CGIを起動してうまく働かない場合の多い例を述べてみよう。

多いエラーの種類

 一般にCGIを起動してよく表示されるエラーには以下のものがあります。

       500エラー
         **cgiなどを書き換えた時に、記号を消したり間違った記述などの文法違反の場合が多いです。
         他にパーミッションの間違いやjcode.plがアッブされていないもしくは壊れている場合もあります。

       404File Not Found
         実際にCGIを設置してあるURLと、呼び出しているURLが違う事とかパスの設定ミスが殆どです。

       Can’t Create Tempfile
         フォルダ自体のパーミッションを間違えている場合が多いです。

       403 アクセス不可
         パーミッションの設定ミスが考えられます。もう一度プロバイダの説明ページを確認してみて下さい。

       Internal Server Erroror
         パーミッションの間違いの場合が多いです。

       Forbidden - You don't have Permission denied Forbidden - You don't have Permission denied
         パーミッションの間違いです。

エラーチェックの手順

 @最初の行のperlへのパスがプロバイダの指定通りになっているか。
 A各ファイルへのパスの記述が間違っていないか。
 B転送時にアスキーモード、バイナリモードが間違っていないか。
 C各ファイルやディレクトリのパーミッションはプロバイダ指定の数値になっているか。
 D必要なファイルは全て転送されているか。またディレクトリが必要な場合は作られているか。
 Eプロバイダの指示されているディレクトリに転送しているか。
 F空のファィルに改行やスペースは含まれていないか。(0byteとなっているか。)

 以上のことがきちんとなされていればCGIプログラムは動くはずです。(時折プログラムのバグもありますが。)
 プログラムの作者のサポートを受ける場合は最低はそれらのことをチェックしてからサポートを受けるよう心懸けて下さい。
 いろんなCGIのサイトのサポートを覗いてみても、質問の殆ど9割近くが上記最低限必要なことがなされていない場合が多いようです。

フリープロバイダへの対応

 最近無料のホームページスペースを借りてホームページを開設されている方が多いですが、設定などに何も間違いは無いのにきちんと表示されないケースが増えています。
 最近のCGIは表示にCSSを使用しているものが増えていますが、その場合プロバイダの広告挿入のJavaScriptが邪魔をしている場合が殆どのようです。そんな場合はCGIプログラムのCSS設定を無効にして試してみて下さい。
 方法としてはCSSの部分を全部削ってしまうか、その部分の各行頭全部に # を入れてみるかで対応出来ます。

文字化けへの対応

 他の章でも述べていますが、潜在的にCGIには文字化けする文字があります。その場合は必ず文字化けする文字の後ろに\を入れるようにして下さい。
 またMACの場合FTPソフトによって文字化けを起こすこともあります。そのような場合はFTPソフトのバージョンを最新版に変えるか、FTPソフト自体を変えてみるかで対応して下さい。

 また掲示板などで文字化けすることもありますがその殆どの原因は半角カナや特殊文字の使用に起因するものです。
 また転送の時に通信状態か何かのせいで jcode.pl がきちんと転送されていない場合もあります。 jcode.pl をもう一度転送し直してみることも必要です。
 他にサーバーとの相性の問題もあります。普通はサーバーはUNIXですが時にはNTベースのこともありますし、また用意されている perl のバージョンが古いことも時折あります。そんな場合はプロバイダに相談してみる方がいいでしょう。

時差への対応

 最近は海外に設置されたサーバーをを使用するユーザーも多く、その場合現地時刻で発言の時刻などが表示されることがあります。そのような場合は大抵のCGIプログラムには最初のあたりに時刻を得る部分がありますのでそこを修正して対応するしかありません。ただし数分などのズレの場合はサーバーのタイマーが原因ですのでプロバイダに依頼して修正してもらうしかありません。

 【例】時刻が9時間進んでいる場合:9時間もどす処理(時刻は秒換算します)
  
変更前:($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
  
変更後:($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time -9*60*60);
 
または、
  
変更前:$times = time; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($times);
  
変更後:$times = time -9*60*60; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($times);

パスワードが認証されない場合

 一般にCGIプログラムの中ではパスワードはcrypt関数によって暗号化されデータとして保存されます。ただサーバーによってはcrypt関数が正常に動作しない場合もあります。そのような場合はcrypt関数での暗号化は避けた方がいいかも知れません。(プログラムによっては使用するかどうかの選択が出来るものもあります。)
 エディタなどでcryptと言う文字を探し、暗号化している部分が何カ所かありますのでその部分を見つけてその行の頭に#を足してみて試してみて下さい。(頭に#を足した行は無視されますのでテストには便利です。)

データが消えてしまう場合、書き込みが出来ない場合

 突然それまでのログが消えてしまうことがあります。
 この原因は大概「同時アクセス」によるものです。例えば掲示板の場合、以下の一連の処理を行います。
 ログを読み込み読みこんだログに新規記事を追加ログを上書き
 「ログを上書き」するときに、ほんのわずかな時間ですが、旧ログを一旦消して新ログを書くという処理を行います。その旧ログを消したタイミングに、たまたま他の誰かの投稿があってログの読みこみ処理が重なると、何もないログを読みこんだ状態となり、後者の投稿処理で「何もない」ままログを「上書き」してしまってログが空っぽとなります。
 対策としては「ファイルロック機能」が大抵のプログラムに付属しています。要は原因となるプログラムの二重起動を防ぐという対策です。
 ただしファイルロック機能を施したからといってもその効果は完全ではありません。 「ログ破損の確率が減少する」という程度に考えておいてください。
 やはり重要なことは普段から「ログのバックアップをまめに取る」という習慣付けが大切だと思います。 ファイルロック機能と合わせた運用を行いましょう。

 また時折書き込みをしようとした場合、「ロック中です」などの表示で書き込みが出来ない場合があります。それは誰かの書き込みを処理している最中に同時にアクセスがあった場合などに起こりますが、その状態がいつも起こる場合は正常にlockファイルが削除されていない場合が多いです。一般にロックファイルは作業中のみ形成されて、作業が終われば削除されてしまうものですが何かの不都合で残る場合もあります。そのような場合は残っているロックファイルを削除して試してみて下さい。

telnetの利用

 プロバイダによって使用の許可をしていないケースもありますが、telnetの使用を認められている場合はCGIプログラムのエラーチェックには大変便利なものです。
 起動方法はWindowsの場合は「スタート」→「ファイル名を指定して実行」で telnet と打ち込んでOKすると telnetの画面が現れます。そこで「接続」→「リモートシステム」を選択するとホスト名などの入力画面が現れます。(ホスト名などの打ち込み方はプロバイダのtelnetの使用方法を参考にして下さい。)
 次にまずホストに入りますとログイン名を尋ねて来ます。入力してEnterを押すと次にパスワードを求めて来ます。パスワードは画面には現れませんけれど打ち込んでEnterを押すと自分のディレクトリに入ることが出来ます。次にcd public_htmlと打ち込みEnterを押すとpublic_htmlディレクトリに入れます。同様にcd ***と打ち込んで目的のディレクトリまで入り込みます。そこで例えばbbs.cgiと打ち込んでEnterを押すとそのプログラムは実行されます。
 正常な場合は画面に現れるHTMLのソースが現れますが、プログラムにミスがある場合はパーミッションが間違っているとかプログラムの何行目あたりに間違いがあるなどの指摘をしてくれます。またその場合注意が必要なのは " の処理が間違っている場合は何行目のくくりが見つからないと言うエラー表示が沢山表示されることがありますが、大抵はその指摘された行よりもかなり前の位置でのミスがあるためです。

 最近はtelnetが使えない方々のためにCGIのディレクトリに転送して直にアクセスすればCGIの文法チェック・エラーチェックをしてくれる便利なCGIもいくつか出来ています。

 もう一つの telnetの使い方としてメールフォームなどでsendmailやnkfなどへのパスが知りたい場合最初に自分のディレクトリに入ったところで which sendmail と打ち込みEnterを押すとそれらのパスが表示されます。
 他にもパーミッションの設定などいろんなことが出来ますが、それらはやはりFTPソフトの方が使いやすいのでここでは説明はいたしません。

サポートを受ける場合の注意

 CGIの作者は基本的には改造プログラムのサポートは行っていません。
 普通に設置してどうしてもCGIプログラムが正常に働かない場合は最終的に作者のサポート掲示板に相談することになります。
 その場合の注意は最低このページの最初に述べていることは自分でチェックしておくこと。単に「動きません」ではなくて具体的にどんな場合うごかないか、どういうエラーが起こるのか、どういうエラー表示がされるのかなどを書き込まなければサポートのしようがありません。
 また例えば bbs.cgi という名のCGIプログラムでしたらそのコピーを作ってパスワードは変えるか抜いておいて bbs_cgi.txtのようにテキストファイルに名前を変えて普通のディレクトリに転送(バイナリモードで)して、動かないCGIのアドレスとそのTXTへのアドレスの両方を明記しておく必要があります。動かないから削除してしまったり、そのソースを見れなかったりすればどこが間違っているのかサポートのしようがありません。

CGIの書き換えミスのチェック

 大変便利なサイトに「CRXの部屋」と言うサイトがあります。そちらの「perl 文法チェッカーWeb版」ではCGIのソースをペーストしてチェックするだけで、書き換え時などのミスが何行目あたりにどういうミスがあるかチェックしてくれます。「CGIリンク集」に掲載しております。