cronでphpとかrubyとかのスクリプトを動かしたいとき
例えば5分毎に動かしたい
*/5 * * * * /usr/bin/php /home/hogehoge/works/hogehoge.php
と書く。phpスクリプトが一つのファイルで構成されている場合ならば、これでも動く。複数のphpファイルが、相対パスでinclude
やrequire__once
とかされている場合、エラーで動かない。
実行時のカレントディレクトリが変わってしまうため、ファイルを参照出来ないから。
解決案
- includeやrequireするときに絶対パスを書く
- まあめんどうだよねってことと、OSが違った場合、パスを書き換えないといけないので、現実的では無い。
- (php限定)ini_setでinclude_pathを設定する
- レンサバとかで有効そう
- シェルスクリプトを書いて、そいつを実行する
- 今回これやった
超簡単なやつ
cron実行時のカレントディレクトリを変えてしまえば良い。
まず、phpのパスを確かめておく。(which php
とかwhich ruby
など)
sh
cd /home/hoge/works/
user/bin/php /home/hoge/works/hogehoge.php
で、このshファイルを実行してあげれば良い
*/5 * * * * /bin/sh /home/hogehoge/works/cron.sh
でもよく考えたら、cronで実行するときにカレントディレクトリを変えてあげればいいんじゃね?
*/5 * * * * cd /home/hogehoge/works/ && /usr/bin/php /home/hogehoge/works/hogehoge.php
みたいな感じで(未検証)