plenv + cpanm + cartonな環境で、crontabでハマった
plenv + cpanm + cartonな環境で、crontabでハマったので、そのときの記録を残しておきます。
Cent OSは、サポート期限が長く使いやすいOSなのですが、個人的には標準で組み込まれる、システムperlのバージョンが古いのがいまいちでした。
その解決方法として、plenvがあります。仮想環境上で、新しいバージョンのperlを使え、とても便利です。その使用方法はいろいろな所で紹介されています。
自分が参考にしたのはこれ
そして、次に課題になるのが、cpanモジュールの管理。
plenvを使えば、
$ plenv install-cpanm
で、簡単にcpanmをインストールできとても便利です。しかし、cpanモジュールのバージョン管理や可搬性を考えると、このままではちょっと物足りません。
そこで、登場するのが、Cartonです。
Install自体は、
$ cpanm Carton
で、簡単に行えます。
モジュールの管理については、
1.3 Cartonによるアプリケーションの実行環境の構築 : Practical Modern Perl (仮)
にわかりやすく書いてありましたので、こちらを参照にしました。
そして、最後に、悩んだポイント、crontabから、この環境を使用しようとした時、一筋縄では行きませんでした。
plenvは、ディレクトリごとにperlの仮想環境を構築します。
Cartonは、cpanモジュールの管理をディレクトリごとに行います。
よって、crontabから、perlのスクリプトを実行する際、意図したバージョンのperl、モジュールを実行するにはディレクトリを意識して、実行しなくてはなりません。
例えば、plenvというユーザーを使い/home/plenv というディレクトリに、plenv + Cartonの環境を構築して、/etc/crontabを編集し
*/1 * * * * plenv /home/plenv/carton exec -- perl test.pl
と記載しても動く動きません。
contabから実行される環境では、ホームディレクトリが引き継がれていなかったり、パスが通っていなかったり、plenvの初期化も走らずうまく動きません。
そこで、以下の様なバッチをかませてやると、うまく動きました。
kick.sh
#!/bin/sh
export HOME=/home/plenv
export PATH="$HOME/.plenv/bin:$PATH"
eval "$(plenv init -)"
cd $HOME
exec carton exec -- "$1"
※2013.08.06 追記
crontabの記載
*/1 * * * * plenv /home/plenv/kick.sh "/home/plenv/test.pl"
同じバッチをかませてやることにより、daemontoolからの起動もスムースに出来るようになります。