私がはまってしまった箇所や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の設定を「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」を付け加えてあげてください。
以上です。
ここら辺を再度確認して実行されたら上手くいくのではないでしょうか?
環境変数の初期化なんて知らなかったので、知っていればもっときれいにシェルが組めたのに。。。
と思いますので、きちんと仕組みを理解しましょう。