cron で Perl スクリプト実行時に Can't locate My/Module.pm in @INC 等のエラーが出る
独自のモジュールを読み込ませて cron を実行するとエラーが出る場合がある。
原因は cron が実行する際のディレクトリが、cron の実行ユーザーのホームディレクトリになるため、任意のディレクトリを @INC に設定していてもエラーが発生する。
モジュールの場所を絶対パスで指定すれば、エラーはなくなるが、可搬性が失われてしまう。
エラーの内容例
% pwd /home/littlebuddha % perl -wc ~/perl/myscript.pl Can't locate My/Module.pm in @INC (@INC contains: /Users/littlebuddha/local/lib/perl5/darwin-2level /Users/littlebuddha/local/lib/perl5 /Users/littlebuddha/local/lib/perl5/darwin-2level /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level /opt/local/lib/perl5/site_perl/5.8.9 /opt/local/lib/perl5/site_perl /opt/local/lib/perl5/vendor_perl/5.8.9/darwin-2level /opt/local/lib/perl5/vendor_perl/5.8.9 /opt/local/lib/perl5/vendor_perl /opt/local/lib/perl5/5.8.9/darwin-2level /opt/local/lib/perl5/5.8.9 .) at perl/myscript.pl line 19. BEGIN failed--compilation aborted at perl/myscript.pl line 19.
対策
CPAN の local::lib を利用する。
まずは、local::lib をインストールする。FreeBSD の場合は、
% whereis p5-local-lib
p5-local-lib: /usr/ports/devel/p5-local-lib
% cd /usr/ports/devel/p5-local-lib
% sudo make fetch-recursive
% sudo make install clean
そして、下記の一行を独自モジュールの読み込み前に追加する。
use FindBin;
use lib $FindBin::Bin;
シンタックスを確認すると、
% perl -wc ~/perl/myscript.pl perl/myscript.pl syntax OK
となって、エラーがなくなる。