― Web Technology and Life ―

個人的なcronの設定

2011-05-06
たまにcronを動かすと、いろいろな環境変数が設定されていなくて意図したとおり動かないことがあるので、いつもはまるところを備忘録として残します。

cronの設定サンプル

# m h  dom mon dow   command
MAILTO="hirobanex@example.com"
SHELL=/bin/zsh
PATH=/home/hirobanex/perl5/perlbrew/bin:
PERL5LIB=./lib:/home/hirobanex/site_perl

5 4 5 * *   /home/hirobanex/project/MyApp/assets/script/batch.sh

設定の解説メモ

cronで動かすときは、基本的に環境変数は全く別の設定になると考えておくべきだ。手動で様々なコマンドを起動するときと、cronで様々なコマンドを起動するときの環境変数の違いは、「printenv」で確認できる。単純に手動でprintenvをたたくのと、cronで「printenv > /home/hirobanex/cron_env.txt」のようにして動かしたものを比較するとわかりやすい。以下は、上記の設定サンプルの個別解説メモ。

MAILTO

cronで起動したプロセスが何らかのエラーで死んだ時のエラーメッセージを飛ばす先を入力。この設定をしておかないと、処理が無事終わったかどうか確認するために独自の実装等が必要なるし、エラーが起きたときの原因究明が大変になる。

SHELL

基本的に、デフォルトのシェルはbashになっているので独自に使っているものがあったらここに設定するのが無難。

PATH

perlbrewのPerlをつかっているときなど、なぜかインストールされているはずのモジュールがないとか言われるので、そのときはcronが普段使っていないシステムPerlで実行プロセスを動かしていることがあった。perlbrewに限らず様々実行コマンドのPATHの確認をしなくてはならない。

PERL5LIB

.zshrcのようなシェル設定ファイルに様々な環境変数を設定している時も要注意だ。「use lib」を使うのがめんどうだからといって、.zshrcに追加のlibを設定したら読み込んでもらえずえらい目にあった。自分の環境に依存しすぎるのも要注意。

実行スクリプトはsh形式で

実際の実行スクリプトは以下のようなシェルスクリプトにしておくのが無難だと思った。

#!/bin/sh

cd $HOME/project/MyApp/
./assets/script/batch.pl 2> ./assets/batch_log/batch.log&

cronでゴチャゴチャ書くと見づらくなり、メンテナンス性も下がる。だいたい、cronで動かしている時点でちょっと適当にという気分でやっているので、メインのバッチ処理の前後にのちのちあれこれ付け加えたくなるものだ。一つのシェルスクリプトファイルにしておけばわりと好きにシェルコマンドを組み合わせたコマンドもかけてちょっと汎用的になる。

最後に

こじこじと環境変数の設定をしたはいいけど、毎度最後にハマる落とし穴は「MAILTO」のところが不十分だからだ。セットアップ仕立てのサーバではメールサーバをいれていない時がある。aptやyumで基本的なメールサーバを入れてとりあえずcronのエラーメールが飛んで来るようにしておくことを忘れないことが重要。。。

Linux update_at : 2011-05-06T16:25:48
hirobanex.netの更新情報の取得
 RSSリーダーで購読する   
blog comments powered by Disqus