読者です 読者をやめる 読者になる 読者になる

とあるプログラマの備忘録

都内某所に住むプログラマが自分用に備忘録を残すという趣旨のブログです。はてなダイアリーから移動しました!

Solarisのcron(クーロン)設定の罠

本来製品を使うところのスケジューラーをテスト環境で動かすために、
cronを使って擬似的にスケジューリングしてみたのですが。。。

巧妙な罠の連発でした。Solarisどんだけーorz

***設定内容
UNIX:Solarisの環境にて、cronを使い、シェル・スクリプトで呼び出したPERLファイルを実行する。

***罠
①まずはエディターをviに設定しないとcronを変更できない!
Perlのファイルをいきなりcronで実行することができない!
③rootで切られていない環境変数はシェルでexprotすること!
LINUXとはn分に一回処理する場合の記述法が違う!
⑤実行権限を渡してやること。
⑥ログにエラーの詳細は出ません!


覚書スタート

root権限で入り、現在のcronの設定を確認

$ su - root
#crontab -l

こんな画面が出てきます。

# crontab -l
#ident "@(#)root 1.21 04/03/23 SMI"
#
# The root crontab should be used to perform accounting data collection.
#
#
10 3 * * * /usr/sbin/logadm
15 3 * * 0 /usr/lib/fs/nfs/nfsfind
30 3 * * * [ -x /usr/lib/gss/gsscred_clean ] && /usr/lib/gss/gsscred_clean

これはSolarisのデフォルトのCron設定、ここにJOBを追加していきます。

cronの設定を変更する場合はこのコマンド

crontab -e

するとこんなんが出ました。

309

309?何が?瞬間的に混乱、よくよく調べてみると、Solarisでは標準エディターが
edとかいうものになっているらしい@@;

よって使いなれたviにエディターを変更

# EDITOR=vi
# export EDITOR

もう一回開くと

#ident "@(#)root 1.21 04/03/23 SMI"
#
# The root crontab should be used to perform accounting data collection.
#0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/bin/perltest/start.sh
#
10 3 * * * /usr/sbin/logadm
15 3 * * 0 /usr/lib/fs/nfs/nfsfind
30 3 * * * [ -x /usr/lib/gss/gsscred_clean ] && /usr/lib/gss/gsscred_clean

OK!読めるようになりました。

今回の目的としてはPERLを5分に一回呼び出したいのですが、
cronはいきなり.plを指定することができないらしいのです。

よってシェル・スクリプトを作成

start.sh

#!/bin/sh
#PERL
/usr/bin/test.pl
exit 0

「ふっ、調べればこれくらいたいしたこのないのだよ」(環境変数がある場合は一番したのシェルのようにしてください。)

シェルを単体で実行してみる。

./start.sh

実行権がありません

orz

# chmod u+x start.sh

これでシェルができた。

やっと、cronの設定
グーグル先生を頼りにcronの書き方を学び、
この行を一番下に追加

 */5 * * * * /usr/bin/test.sh

ところが、

crontab: 前の行にエラーがあります; unexpected character found in line.

ハァ?(#゜Ц゜)

また調べる羽目に、どうやらSolarisの場合はこの書き方はできないらしい。よってこんな面倒な記述に変更

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/bin/start.sh

「お高くとまりやがって!」
心の中で毒づきながら5分待ち、ログを見てみる

# view /var/cron/log

ちゃんとシェルが呼ばれています。

・・・でも実はこの実行しているPerlは処理が終わると自作のログファイルに出力する仕様だったのです。
ですが、待てど暮らせど全然ログが吐かれない。
おかしい、おかしいぞ?

cronログを見ても正常に動作しているように見える。
実際シェルは動いている。

何でログが吐かれないのかさっぱりわからない状態でしたが、K先輩から
先輩「メールに変なエラーが来てるよ?」
俺「メール?」

# mail

Subject: Output from "cron" command
Content-Length: 276

Your "cron" job on aquarius
/usr/bin/start.sh

produced the following output:

DBI connect failed: ERROR OCIEnvNlsCreate. Check ORACLE_HOME env var, NLS settings, permissions, etc. at /usr/bin/test.pl line 25

なるほど、まさかメールでエラーをよこすとは夢にも思いませんでしたよ。

なのでシェルに環境変数を追加だ畜生!

#!/bin/sh
#環境変数設定
ORACLE_BASE=[ORACLE_BASE PATH] ; export ORACLE_BASE
ORACLE_HOME=[ORACLE_HOME PATH] ; export ORACLE_HOME
ORACLE_SID=[SID] ; export ORACLE_SID

#PERL
/usr/bin/test.pl
exit 0

ORACLEのPATHはマシン設定を入れる。
ここで終了。

長かった、疲れた。

最後にSolarisでcron再起動する場合はこんな感じ
(root)

# svcadm restart svc:/system/cron:default

(user)

$ sudo svcadm restart svc:/system/cron:default