aramsanのブログ

八方塞がりの年にあえて挑戦し始めるエンジニアリングブログ

plenv + cpanm + cartonな環境で、crontabでハマった

plenv + cpanm + cartonな環境で、crontabでハマったので、そのときの記録を残しておきます。

 

Cent OSは、サポート期限が長く使いやすいOSなのですが、個人的には標準で組み込まれる、システムperlのバージョンが古いのがいまいちでした。

その解決方法として、plenvがあります。仮想環境上で、新しいバージョンのperlを使え、とても便利です。その使用方法はいろいろな所で紹介されています。

自分が参考にしたのはこれ

plenvを使ってみた. - Masteries

そして、次に課題になるのが、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からの起動もスムースに出来るようになります。