6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PSGIで.cgiプログラムを動かすときはshebangに注意しよう

Last updated at Posted at 2015-02-09

plenv + cpanmな環境でMovableTypeをPSGIで動かそうとしたのですが、

plackup mt.psgi で起動した後、
ブラウザで mt.cgiにアクセスしたところ、

  • mt.cgi → mt-upgrade.cgi にリダイレクト
  • mt-upgrade.cgiが DBD::mysqlを見つけられなくてエラー

という現象に遭遇しました。(starmanで起動しても同じエラー)

エラーメッセージを見てみると、@INCがplenvのそれではなくsystem perlのデフォルトのライブラリパスになっていました。

plackupの-Iオプションでライブラリパスを指定しても、スクリプト内のuse libの引数をいじってみても効果なし。

原因はshebangでした。

2時間ほど格闘したあげく、原因がわかりました。
.cgiファイルのshebangが原因で、system perlの上で動いてしまっていました。

diff --git a/mt-upgrade.cgi b/mt-upgrade.cgi
index 8e3c540..70da90c 100755
--- a/mt-upgrade.cgi
+++ b/mt-upgrade.cgi
@@ -1,4 +1,4 @@
-#!/usr/bin/perl -w
+#!/usr/bin/env perl

 # Movable Type (r) Open Source (C) 2001-2013 Six Apart, Ltd.
 # This program is distributed under the terms of the
diff --git a/mt.cgi b/mt.cgi
index 20b6de9..198f88b 100755
--- a/mt.cgi
+++ b/mt.cgi
@@ -1,4 +1,4 @@
-#!/usr/bin/perl -w
+#!/usr/bin/env perl

一括で置換するにはこうすればOKです。

find . -name '*.cgi' | xargs perl -pi -e 's|#!/usr/bin/perl -w|#!/usr/bin/env perl|'

これで直りました。

~/.plenv/shims/plackupから起動してるんだから.cgiファイルのシェバンは無効だろうと思い込んでいたのですが、どうやらPSGIでcgiファイルを読み込むとシェバンが優先されてしまうようです。

PSGIの仕様なんでしょうか?

6
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?