本日からWinサーバへ移設予定だったCGIがコピー中に破損したらしく、急遽古いファイルからバックアップしたら動作しなくなった。
5時間ばかり格闘し、漸く突き止めた原因はファイルロックに用いたSymlink関数だった。そういや「シンボリックリンクがサポートされてないプラットフォームではエラーになる」とあったな。今までnix系でしか動かしてなかったから忘れてたけど、最初にこの手法を学んだKENT WebのCGIにも「Win鯖で動かすときは使えない」と注意書きがあった筈。
そもそもバックアップの管理がきちんとしていれば起きなかった事故ではあるので詰めの甘さに反省しきりだが、再発防止と同じような目に遭った人への情報提供を兼ねてここへ記しておくものである。
ついでに調査手法、というほどの代物でもないが一応。
最初に出たエラーは「CGI Error」だったので文法に問題があるものとPerl文法チェッカで確認する。しかし「文法OK、パス不正、実行権なし」、するとアクセス権設定あたりの問題かと弄るも、そもそも正常動作している文法チェッカ自身に対しても同様の結果を返すので信憑性がない。
エラーメッセージを読むにhttpヘッダの出力異常が原因と見られたのでヘッダ出力を最初に移動、これでページ表示そのものは行なえるようになったがログへの書き込みができない。やはりアクセス権の問題だろうか。
フォームデータ送信後、確認画面がヘッダ以下出力されていなかったので、この辺が原因と思われたが手掛りがない。
当初Sendmailを利用して確認メール送信していたものを削ったため、残っていたメール送信処理部分あたりで引っ掛かっているのかと思いサブルーチン検索するが当該箇所はすべてコメントアウトされている。
またその絡みでjcode.plを利用していたものをコメントアウトしたつもりが取り零しのある可能性を考慮しjcodeも再設置。しかし状況変わらず。
同じスクリプトをMacのローカルで動作チェックする限りでは正常に動いており書き込みも完了している。ということは環境との整合性による問題であることはほぼ明らかだ。
いよいよログのアクセス権に問題があるのかと考えたが、別に用意したログ編集用スクリプトは問題なく書き換えを実行できた。ということはファイル側ではない。
観念してフォームデータ送信後の処理に段階的に「○○チェック OK」 の出力を挟む。と、データ受け取り→内容チェックを通った直後で停まっていることが判明。ここにあるのはファイルロック処理……そう言えばWinだと動作しないとかなんとか……←今ここ