スクリプトのデプロイや移行作業で「このモジュールは入っているか?」の確認が必要になる場面は多くあります。ある運用現場では、サーバー移行時にインストール済みモジュールのリストを把握しないまま作業を進め、本番稼働後にモジュール不足のエラーが頻発した事例もあります。本記事では、Linuxサーバーでインストール済みのPerlモジュールを確認・一覧取得する実務的な手順を解説します。
まず結論 ― 即使える確認コマンド2択
インストール済みモジュールをすぐ確認するには、以下の2つが手軽です。
# ① @INCのパス以下にある .pm ファイルを全列挙(インストール手段を問わず網羅)
find $(perl -e 'print join(" ", grep { -d } @INC)') -name '*.pm' 2>/dev/null | sort
# ② ExtUtils::Installed でモジュール名とバージョンを正確に取得(追加インストール不要)
perl -MExtUtils::Installed -e '
my $inst = ExtUtils::Installed->new;
for my $mod ($inst->modules) {
printf "%-40s %s\n", $mod, $inst->version($mod) // "N/A";
}
'
①はファイルシステム上の .pm ファイルをそのまま列挙する方法で、インストール手段(CPANかOSのパッケージ管理か)を問わず幅広く拾えます。ただしファイルパスしか分からず、同一モジュールが複数バージョン共存している場合は重複します。②は Perl 標準添付の ExtUtils::Installed を利用するため追加インストールが不要で、モジュール名・バージョンをまとめて取得できます。用途に応じて使い分けてください。
Perlの検索パス(@INC)の仕組みを理解する
Perl はモジュールをロードする際に、@INC という配列に列挙されたディレクトリを順に探索します。このパス一覧を確認するには以下のコマンドを使います。
perl -e 'print join("\n", @INC)'
AlmaLinux 9 や Rocky Linux 9(Perl 5.32 系)での出力例は以下のとおりです。
/usr/local/lib64/perl5/5.32
/usr/local/share/perl5/5.32
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5
Ubuntu 24.04(Perl 5.38)では /usr/lib/x86_64-linux-gnu/perl5/5.38 や /usr/share/perl5 といったパスが並びます。どのディストリビューションでも @INC の末尾には .(カレントディレクトリ)が含まれることがあり、find にそのまま渡すとエラーになるケースがあります。冒頭のコマンドで使っている grep { -d } は、存在するディレクトリのみに絞り込むフィルタです。スクリプトに組み込む際も同様の処理を挟むことを推奨します。
OSのパッケージ管理でインストール済みを確認する
OSのパッケージ管理経由でインストールされたPerlモジュールは、ExtUtils::Installed に表示されない場合があります。ディストリビューションのツールで直接確認するほうが確実です。
# AlmaLinux / Rocky Linux / RHEL 系(dnf)
dnf list installed 'perl-*'
# Debian / Ubuntu 系(dpkg)
dpkg -l '*perl*' | grep '^ii'
# cpanminus を使っている環境では
cpanm --list-installed 2>/dev/null
dnf list installed 'perl-*' はパッケージ名でフィルタするため、モジュール名とパッケージ名が一致しない場合があります(例:perl-DBI パッケージが DBI モジュールを提供する)。パッケージが提供する .pm ファイルを確認するには rpm -ql perl-DBI | grep '\.pm$' が使えます。Debian 系なら dpkg -L libdbi-perl | grep '\.pm$' で同様の確認が可能です。
特定のモジュールだけをピンポイントで確認する
「このモジュールは使えるか?バージョンはいくつか?」を一発で確認したい場面では以下が便利です。
# モジュールが利用可能かとバージョンを確認(DBI の例)
perl -MDBI -e 'print $DBI::VERSION, "\n"'
# モジュールがない場合は以下のエラーが出る
# Can't locate DBI.pm in @INC ...
# インストールパスも一緒に確認
perl -MDBI -e 'print $INC{"DBI.pm"}, "\n"'
# perldoc でモジュール情報を表示(パスも出る)
perldoc -l DBI
デプロイ前の事前チェックとして、必要なモジュールを列挙したリストファイルと照合するシェルスクリプトを用意している現場もあります。
# required_modules.txt に1行1モジュール名を記載して一括チェック
while IFS= read -r mod; do
perl -M"$mod" -e "print \"OK: \${mod} \${\${mod}::VERSION}\n\"" 2>/dev/null \
|| echo "NG: ${mod} not found"
done < required_modules.txt
変数展開の都合上、モジュール名にコロン(::)が含まれる場合(例:IO::Socket::SSL)は ${mod}::VERSION の参照が正しく動作しないことがあります。その場合は perl -MIO::Socket::SSL -e 'print IO::Socket::SSL->VERSION, "\n"' のように直接指定してください。
移行・複製作業での活用パターン
サーバーの移行や複製作業では、移行元と移行先のモジュール差分を事前に把握しておくことが重要です。以下の手順が実務でよく使われます。
# 【移行元】CPANインストール済みモジュールをリスト出力
perl -MExtUtils::Installed -e '
my $inst = ExtUtils::Installed->new;
print join("\n", $inst->modules), "\n";
' > installed_modules.txt
# 【移行元】OSパッケージ管理のものも合わせて出力(RHEL系の例)
dnf list installed 'perl-*' --quiet | awk '{print $1}' >> installed_modules.txt
# 【移行先】cpanm で一括インストール(Perl::ModuleInstall等が必要な場合)
# ※ OS管理パッケージは dnf/apt で別途インストールすること
cpanm --notest $(cat installed_modules.txt | grep -v '^perl-') 2>&1 | tee cpanm_install.log
CPANインストール済みのモジュールと、OSパッケージ管理(dnf/apt)でインストールしたモジュールは管理経路が異なります。cpanm で一括インストールする前に、OS側のパッケージとして提供されているものは先に dnf install や apt install で入れておくと、依存関係の解決がスムーズになります。また、cpanm --notest は依存解決を省略するオプションではないため、依存関係のあるモジュールは自動的にインストールされます。本番環境への適用前にはステージング環境での動作確認を必ず実施してください。
「コマンドは打てる。次は"現場で通用する型"を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
