mixhostのレンタルサーバーで遊ぶ その9: Perlモジュールを追加する

前回mixhostのレンタルサーバーにWP-CLIというツールを導入して、WordPressをコマンドラインで操作する方法を紹介しました。

今回もmixhostのコマンドライン(シェル)を活用するためにPerlのモジュールを追加してみたいと思います。

なおmixhostのコマンドラインを使うためにはSSHでレンタルサーバに接続する方法があります。SSHでの接続方法については下記を参照してみてください。

今回はmixhostのレンタルサーバーで各クライアントで生成した認証キーを使ってSSH接続する方法を紹介します。mixhostの推奨方法はサーバ側(cPanel)で認証キーを生成して秘密キーをクライアントにコピーする方法ですが、本来はクライアントの生成した公開キーをサーバに登録する方が良いのではないかと思います。

mixhostのPerl環境

mixhostではCGI用にPerlが実行できるようになっています。しかし、しかしこのPerlについてはCGIに関係なく普通にコマンドラインで利用することができます。

$ which perl
/usr/bin/perl

バージョンを確認してみるとv5.16.3であることがわかります。

$ perl --version

This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi
(with 40 registered patches, see perl -V for more detail)

Copyright 1987-2012, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

デフォルトでインストールされているモジュールを表示させてみましょう。

$ perl -MExtUtils::Installed -e '$inst=ExtUtils::Installed->new();print $_." ".$inst->version($_)."\n" for $inst->modules'
Alien::Build 2.21
Alien::Libxml2 0.16
AppConfig 1.71
Authen::Simple 0.5
Authen::Simple::Passwd 0.6
CPAN 1.9800
CPAN::Meta::Requirements 2.140
CPAN::Meta::YAML 0.018
Canary::Stability 2013
Capture::Tiny 0.48
Class::Accessor 0.51
Class::Data::Inheritable 0.08
Crypt::PasswdMD5 1.40
Digest::MD5 2.55
Expect 1.35
ExtUtils::MakeMaker 7.36
ExtUtils::ParseXS 3.35
FFI::CheckLib 0.23
File::Which 1.23
File::chdir 0.1010
HTTP::Tiny 0.076
IO::Stringy 2.113
IO::Tty 1.12
JSON::XS 4.02
List::Util 1.55
Module::Implementation 0.09
Module::Runtime 0.016
Params::Validate 1.29
Path::Tiny 0.108
Perl 5.16.3
Template 3.008
Test::Simple 1.302162
Try::Tiny 0.30
XML::LibXML 2.0204
XML::NamespaceSupport 1.12
XML::Parser 2.44
XML::SAX 1.00
XML::SAX::Base 1.09
XML::SAX::Expat 0.51
XML::Simple 2.25
YAML::Syck 1.32
local::lib 2.000024
version 0.9924

JSONやXMLなどのモジュールは入っていそうです。

必要なモジュールの確認

モジュールがインストールされているかどうかというのは、perlを実行することで確認可能です。

$ perl -e 'use モジュール名;'

このコマンドを実行して何も表示されなければ(=エラーがなければ)そのモジュールはインストールされていることになります。

私はレンタルサーバ上で自前のperlスクリプトを動かして、ExcelファイルからHTMLファイルを生成したいと思っています。

この自前スクリプトで使用しているモジュールとmixhostのインストール状況を調べると次のようになっていました。

モジュール名インストール状況
DateTime
DateTime::Format::Strptime
Digest::MD5
Encode
File::Path
Image::Imlib2
LWP::UserAgent
Spreadsheet::ParseExcel

自前スクリプトを実行するには「未」となっているモジュールをインストールする必要があります。

モジュールのインストール

mixhostの管理ツールであるcPanelではPerlモジュールをインストールする機能が提供されています。

cPanelへのログイン方法については下記を参照してください。

今回はmixhostで最初に行った方が良さそうな設定を紹介します。mixhostはcPanelで様々な設定が簡単にできます。レンタルサーバーを初めて使いましたが、ここで紹介した設定も、設定ファイルなどをいじることなく変更できとても簡単でした。

このcPanelの「ソフトウェア」から「Perlモジュール」を選択しましょう。

Perlモジュールを選択

これでPerl Module Installerという画面が表示されます。

この画面の「Find a “Perl Module”」にモジュール名を入力して「検索」を選択してみましょう。

Perlモジュールの検索

例えば「DateTime」で検索すると大量にモジュールが出てきますが、2ページ目に目的のモジュールが出てきます。

Perlモジュールの検索結果

目的のモジュールを見つけたら「インストール」を選択します。

これでインストール処理が始まります。

Perlモジュールのインストール

モジュールによると思いますが結構時間がかかります。DateTimeモジュールの場合は2・3分かかったと思います。

「完了」と表示されればインストール完了です。

Perlモジュールのインストール完了

コマンドラインでインストールしたモジュールが使えるか確認してみましょう。

このときperlコマンドではなくperlmlコマンドを使うのがポイントです。

$ perlml -e 'use DateTime;'
(エラーなし)

あるいは先にcPanelUserConfigモジュールをロードするようにします。

$ perl -e 'use cPanelUserConfig; use DateTime;'
(エラーなし)

従来通りperlコマンドを使うとエラーになる(=追加インストールしたモジュールが使えない)ので注意してください。

$ perl -e 'use DateTime;'
Can't locate DateTime.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at -e line 1.
BEGIN failed--compilation aborted at -e line 1.

このようにして必要なモジュールを入れていきます。

インストールエラー

必要なモジュールをインストーすれば官僚と思ったら、「Image::Imlib2」はエラーになってしまいました。

Perlモジュールのインストール失敗

「完了」と表示されて終わったように見えますが「failed」となっています。

もちろん確認してみても、このモジュールを使おうとするとエラーになります。

$ perlml -e 'use Image::Imlib2'
Can't locate Image/Imlib2.pm in @INC (@INC contains: 省略 /usr/lib64/perl5 /usr/share/perl5 .) at -e line 1.
BEGIN failed--compilation aborted at -e line 1.

どうやらPerlのImage::imlib2というモジュールは、C言語で作成されているlibimlib2というライブラリを利用しており、libimlib2がインストールされていないと利用できないようです。

mixhostではコンパイラ(gcc)が利用できるので頑張ればlibimlib2を導入できるかもしれませんが、libimlib2自体が様々なライブラリに依存しており、芋づる式に導入すべきライブラリが増えそうです。

結局、私はImage::imlib2の代わりにImage:Magickを利用することでこの問題を回避することにしました。

Image::Magickモジュールについては正常にインストールすることができます。

Image::Magickのインストール

Image::Magickモジュールも動作にはImageMagickというプログラムが必要になるのですが、mixhostではIamgeMagickが利用可能なためImage::Magickモジュールも利用できます。

Perlスクリプトの実行

必要なモジュールをインストールしたら、mixhost上で実行したいPerlスクリプトをmixhostに転送して実行してみましょう。

ファイルを転送した後は実行ビットをつけるのを忘れないようにしましょう。

$ chmod +x 実行したいperlスクリプト

perlスクリプトを実行すると次のようなエラーが出る場合があります。

Can't locate Spreadsheet/ParseExcel.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at ./スクリプト名 line 2.
BEGIN failed--compilation aborted at ./スクリプト名 line 2.

これはperlスクリプトの1行目のインタープリタの指定が間違っているため生じます。

1行目の「#!/usr/bin/perl」を「#!/usr/bin/perlml」に書き換えるとこのエラーは解消するはずです。


まとめ

今回はmixhostのレンタルサーバーでPerlモジュールを追加する方法を紹介しました。

mixhostで自作のPerlスクリプトを実行する場合は、デフォルトで導入されているモジュールでは不足するケースもあると思います。CPanelを使えばモジュールは追加可能なので、自作のPerlスクリプトが動かない場合は試してみましょう。