cakephpでのcronの設定
最近授業や仕事の合間に作ってるwebアプリに必要なcronの設定が上手くいっておらず、テストデータで開発してた。
結構、cronの設定はぐぐるとハマる人が多かったっぽいので、迅速な解決ができるようトラブルシューティングの過程をメモ。
今回はcakephpのshellクラスを用いた設定より(←便利なんだろうけど)、linuxのcronの設定を経験のため、選択。
参考にしたのは以下の2サイト。
大体、これ見れば出来る(が、俺ははまったorz)
CakePHP Tips
http://blog.xao.jp/blog/?p=137
今回、自分の環境では以下のactionをcronで実行。(cakephpのバージョンをディレクトリに書いてないと忘れるんですw)
http://www.exsample.com/cake_1_3/コントローラー名/メソッド名↓
ex
http://www.exsample.com/cake_1_3/controller/action
まず、スクリプトファイルを以下に作成
[VENDORS]/shells/cron.sh
シェルが、PHPのプロセッサに渡すファイルを作成
[APP]/vendors/shells/cron/controller_action.php
$_GET['url'] = "controller/action";
require_once( dirname(dirname(dirname(dirname(__FILE__)))) ."/index.php" );
cron のジョブ設定
コマンドでcrontab -e でジョブの編集(毎時00分実行)
00 * * * *
root sh /フルパス/cake_1_3/app/vendors/shells/cron.sh
/フルパス/cake_1_3/app/vendors/shells/cron/controller_action.php
これでOK!
のはずが動かない。ログを確認してみる
ちゃんと実行されてるじゃん!って思ったけど
ただ、cronのログはあくまでcron自体が実行できればエラーログをはくことはないらしい(実行した内容にエラーがあってもcronのログには残らない)
なので、ここを参考にcrontabを編集。
crontabがどうしても動かないときに確認すべき3つの点+α
00 * * * *
root sh /フルパス/cake_1_3/app/vendors/shells/cron.sh
/フルパス/cake_1_3/app/vendors/shells/cron/pagerank_index.php
>>/tmp/analog.log 2>>/tmp/analog-err.log
コマンド >>log.log 2>>errlog.log
とコマンドの後に >> や 2>> とすると標準出力や標準エラー出力のログを指定したファイルに記録してくれるらしい
1>>は標準出力(1は省略可) 2>>は標準エラー出力
これで、再度cronを実行し、エラーログを見てみる。
vi /tmp/analog-err.log
そしたら、こんなログが吐き出されてた
/bin/sh: root: command not found
フルパスで書くようにしてるからパスが通ってないって事はないし、なんでだろう
そうゆう時はggrks!
それっぽいの発見!
どうやら/etc/crontabを参考に、crontab -eで編集してcronを設定したが、この二つのフォーマットが違うらしい。
ここを参考にフォーマットをそろえてcrontabを再度編集。
/bin/sh: root: command not foundの原因
00 * * * *
sh /フルパス/cake_1_3/app/vendors/shells/cron.sh
/var/www/html/cake_1_3/app/vendors/shells/cron/controller_action.php
>>/tmp/analog.log 2>>/tmp/analog-err.log
再度実行、また、ちゃんとスクリプトが動いてない。なんでや!と思いログ確認してみると今度は
sh: /フルパス/cake_1_3/app/vendors/shells/cron/cron.sh: No such file or directory
あ、、、パスの書き間違えだった。。。。
sh: /フルパス/cake_1_3/app/vendors/shells/cron.sh
に書き直してめでたく実行されましたと。