どちらかというとごはん派

主に仕事用のメモブログ。

【cron】LinuxでのCron作成(エラー編)

2008年11月27日 16時13分53秒 | linux bash
私がはまってしまった箇所やCronの設定で失敗している人の現象から
分かる範囲で解決させましょう。

だいたいの方(私も)は、Cronの設定を「crontab -l」で確認しても大丈夫そう。
そしてログを見てもリロードしているっぽい。
そしてCronも起動済みだけど起動しない。という現象なので、
それを前提としたケースを上げてみる。
(つまり、Cronが起動してなかったとかパス間違えとかいうアレゲなエラーは知らないよ。ってことです。はい。)

①環境変数は初期化されてしまうようです。
 実行したいシェルの内部で利用している環境変数をprofileに書き込んでおいたのですが
 (Linux起動時に有効になる環境変数のことです。)
 Cron起動時には設定されていませんでした。
 シェルからjavaを呼んでいる方なんかは、「PATH=:/usr/local/jdk」とかprofileに
 付け加えたと思うんですが、それがCron起動では無効になってしまいます。
 シェルをただ叩くだけなら有効なんですが、
 Cron起動では初期化され「/usr/bin:/bin」位しか設定されていませんので、
 crontab -eで「PATH=:/usr/local/jdk」や、その他自分で設定した環境変数を記述しましょう。
 
 Cron起動時にenvコマンドを設定すると環境変数がどうなっているか確認できますので
 試してみてください。
 
②SHELLの指定してますか?
 crontab -eでSHELLを指定しないと大抵/bin/shが呼ばれてしまうので、
 bashやkchを使用している方などは、きちんと設定してください。
 
③コマンドモードになってませんか?
 起動時刻を過ぎてcronのログファイル(/var/log/cron)を確認したら、
 なんだか実行したっぽいけど、、、でも上手くいかない場合。
 
 Nov 26 12:43:01 server crond[7651]: (testuser) CMD (run-parts /usr/test/test.sh)
 上記のようなログだった場合に、「CMD」と書いてある場合、
 「CMD」以下の()をコマンドとして実行してあります。
 
 そのため、run-partsとかいうコマンドはないからエラーになってしまうのです。
 これで「sh /usr/test/test.sh」とすればうまくいきます。
 
 Cronの設定をググると「run-parts」というのがあったりなかったりするのですが、
 「実行する」という意味らしいので、コマンドエラーになってしまうなら、直に「sh」で実行させてしまいましょう。
 メリットデメリットはありません。
 
④Cannot open /test.log : No such file or directory
 メールをみるとこんなエラーが出ていたりするのですが、コレは①のエラーに近いものです。
 環境変数として「LOG_OUT=/usr/test/logs」とかをprofileで設定していた場合、
 やはり無効になってしまっていて、
 シェル内の「printf "ログ出力します。" >> ${LOG_OUT}/test.log」
 なんかで、「${LOG_OUT}/test.log」が「/usr/test/logs/test.log」と展開されたい場合に「/test.log」と展開されてしまっているわけです。
 それで、test.logなんていうディレクトリはありませんよ。と言ってるわけです。
 
 これもcrontab -eで「LOG_OUT=/usr/test/logs」を付け加えてあげてください。
 
以上です。
ここら辺を再度確認して実行されたら上手くいくのではないでしょうか?
環境変数の初期化なんて知らなかったので、知っていればもっときれいにシェルが組めたのに。。。
と思いますので、きちんと仕組みを理解しましょう。

【cron】LinuxでのCron作成(作成編)

2008年11月27日 15時28分18秒 | linux bash
LinuxでのCronの作成を行います。
私がはまってしまった箇所や意外とCronの設定で失敗している人が多いようなので
(多い割りにエラー解決の資料が少なくて困りました。)
そこら辺の解決になるようなことはエラー編に書いておきます。
エラーやはまってしまった方は「LinuxでのCron作成(エラー編)」を見てください。
こちらでは、作成部分を書いておきます。

◇前提条件◇
 実行したいシェル・・・/usr/test/test.sh
 シェルの実行ユーザ・・testuser

①まず、rootユーザになること。
 su

②rootユーザで、testuserのcronを作成する。
 ◇理由◇
  rootユーザで、rootのcronにtestuserで実行するように設定しても
  上手くいかないことがある。

  testuserで作成するときには、cronの作成権限を渡してあげる必要があるので、
  ちょっとめんどい。

 まずは、viでcron編集をするように以下のコマンドを投げる
 EDITOR=vi; export EDITOR
 デフォルトのエディターをviにするよ。ってこと。
 意外と重要です。これをしないと変なエディターが起動して、何も出来ません。
 
 それでは、以下のコマンドで、実際に作成する。
 crontab -u testuser -e
 (-uはrootでどのユーザのcronを作成するかを宣言し、-eは作成モードっていうこと。ちなみに-lは確認モード。)

③viで書き込む
 viで開いたら、「i」を押下して「挿入モード」にする。
 挿入モードになったら、以下をコピペする。
 -------------------------------------------------------------------------------------------------
 SHELL=/bin/bash
 PATH=/home/testuser/bin
 MAILTO=testuser
 HOME=/
 
 # run-parts
 0 16 * * * /usr/test/test.sh
 -------------------------------------------------------------------------------------------------
 
 コピペしたら「ESCキー」を押下して「ZZ」(保存して終了)を押下して終了します。

④確認してみましょう
 /var/spool/cron配下にtestuserというファイルが出来るので
 catして、上記と同様である旨を確認する。
 パーミッションは500

 cronのログファイル(/var/log/cron)をcatしてみて
 Nov 26 15:21:01 server crond[6417]: (testuser) RELOAD (cron/testuser)
 こんなようなのがでてればOKです。Cronさんが設定ファイルをリロードしてくれました。

 でてなければCronが起動していない可能性があります。ので起動させておきましょう。
 再起動:service crond restart
 起動 :service crond start

これで、私は「0 16 * * *」で設定したので、16時に起動されるのを待って、確認します。

起動時刻になっても起動しない場合は、「/var/spool/mail/testuser」を見て、
届いたメールから、エラーの内容を確認しましょう。