おれのIT日記
2025/03/03 (月)
Linux
crontabでPerlスクリプトを動かすとモジュールが見つからない
ふだん使いのLinuxマシンでは、perlbrewを使うことが多くなったが、メインのサーバだけは、そうしていない。この貧弱なホームページを公開するためのhttpdや、大好きなラジオを録音するcronなどが動いておるため、あまり変なことにならないよう、常日頃からシステムPerl、すなわち/usr/bin/perlを使うようにしておった。
ところが、あまりに大事にしすぎて、ややこしいことを避けていたせいか、ちょっとした単純なことがわからなくなり、ハマってしまった。
自分のためにメモしておく。他人の役にもしも立ったら、ちょっとだけ嬉しい。
sshでは動くのに、crontabに登録するとエラーになる、という、よくあるやつですね。
こちらのページも参考にさせて頂きました、ありがとうございます。
■ the code to rock 2017-05-16 crontabでPerlスクリプトを動かそうとしてハマった話
さて我が家で問題になった下記のxxx.shは、中ではperlを呼び出しており、sshで動かす分には何の問題もなく動く。
手で動かすのが面倒だから、そろそろ自動化しよう、という経緯だから当然ですね。
そんな状態だから、エラーログさえ取らずに流していたので、何故、結果が得られないのか、さっぱりわからんかった。あらためてちゃんとログを取るようにして……
$ crontab -e
(大部分省略)
0 * * * * * /home/hogehoge/xxx.sh > /home/hogehoge/cron.log 2>&1
……とれたエラーログを見てみると、うちの場合は、或るPerlモジュールが見つからないためとわかった。
システムPerl側にもモジュールをインストールすべきなのかもしれないが、面倒だし、変なことになったら嫌だったので……
$ crontab -e
(大部分省略)
xx * * * * * PERL5LIB=/home/hogehoge/perl5 /home/hogehoge/xxx.pl > /home/hogehoge/cron.log 2>&1
……というように、PERL5LIB指定の環境変数だけ場当たり的に追加してみたら、このケースでは動いたので、これでおしまいにした。
システムPerlを普段使いにしているから、これだけで安心して動かせるわけだが、Perlバージョンが違ったりすると、ちょっと危険ですね。
とにかく安定して動いているサーバをいじくるのは慎重にしたく。
保守の姿勢とは、そういうものだ。たとえPCをいじるだけの話であっても、同じ哲学が適用されるのである。
以上。