MEMORVA

主なレンタルサーバーのPerl、Ruby、Pythonのパス

更新:

Perl、Ruby、Python などで書かれたCGIプログラムを実行する場合、ファイルの先頭(1行目)にインタプリタを指定する。 例えば Perl の場合は以下のように書く。

#!/usr/bin/perl

この表記はシバンと呼ばれ、各インタプリタへのパスを指定する。 詳しくは シバン(Wikipedia) を参照。

パスはレンタルサーバーによって異なる場合がある。 以下は、私が利用したことがあるレンタルサーバーにおけるパスの例。 本記事更新時点のもの。

PHP Perl Ruby Python
さくらのレンタルサーバ /usr/local/bin/php /usr/bin/perl /usr/local/bin/ruby /usr/local/bin/python
ロリポップ! /usr/local/bin/php8.3 /usr/local/bin/perl /usr/local/bin/ruby2.6 /usr/local/bin/python3.7
エックスサーバー /usr/bin/php8.3 /usr/bin/perl /usr/bin/ruby /usr/bin/python3.6
コアサーバー /usr/local/bin/php /usr/bin/perl /opt/alt/ruby32/bin/ruby /usr/bin/python3
ConoHa WING /usr/bin/php /usr/bin/perl /opt/alt/ruby25/bin/ruby /opt/alt/python36/bin/python3.6

各言語にて複数のバージョンが選択できる場合、バージョンによってパスが異なる。 また、各社プランや新旧サーバーなどの違いでパスが異なる場合がある。

通常PHPのプログラムはパスを書く必要はないが、cronでPHPプログラムを実行する際に(cronのコマンドで)必要となる。

詳しくは以下の公式サイトのヘルプを参照。

CGIプログラムが動作しない

CGIプログラムが動作しない、Internal Server Error などのエラーが出る場合、以下の原因が考えられる。

  • 上述のパスの記述が正しくない。
  • 実行ファイルのパーミッションが正しくない。
  • ソースコードの改行コードがLF(\n)になっていない。

上2つについてはわりと知られているが、改行コードは見落としている場合がある。 Perlで書かれた古いCGIプログラムは、改行コードがWindowsで使われているCRLF(\r\n)になっていることがある。 昔はそれでもプロバイダのサーバーで動作していた時代もあったが、現在はエラーになる場合がある。

改行コードはテキストエディタで変換できる。 例えば、サクラエディタでは名前を付けて保存する際、保存時のウィンドウの下の方に「改行コード」があり、CRLF、LF、CRが選択できる。

env 表記

パスは以下のような表記が出来る場合がある。

#!/usr/bin/env perl

このように書くことでサーバーによってパスが異なっていてもパスを書き換えなくて済む。 ただし、これで動作するかはサーバーによる。 さくらのレンタルサーバで試したところ、Perl、Ruby、Python についてCGIプログラムが動作するのを確認した。

Perl
#!/usr/bin/env perl
Ruby
#!/usr/bin/env ruby
Python
#!/usr/bin/env python

ただし、各言語にて複数のバージョンがインストールされている場合、どのバージョンが実行されるか分からないので注意する必要がある。 どのバージョンが実行されているのか確認した方が良い。