エラーが発生し、cronが実行されない原因について説明する。
以下のようなcronのコマンドを書いたとする。
/usr/bin/php7.1 /home/username/example.com/public_html/test.php
例えば PHP であれば、実行するプログラム内で require() などで別のプログラムを読み込んでいる場合、No such file or directory などの警告が出る。 その場合、cd で実行するプログラムがあるディレクトリへ移動した後、プログラムを実行すればエラーが発生しない。 例えば、上記の例は以下のように書き直す。
cd /home/username/hoge/ ; /usr/bin/php ./test.php
cd で test.php がある /home/username/hoge/ へ移動した後、/usr/bin/php で test.php を実行している。 サーバーの設定によっては PHP のパスを書かなくても PHP を実行できるが、書いておいた方が無難。 私が使用しているさくらのレンタルサーバ(スタンダード)とエックスサーバー(X10)では、この書式で動作を確認済み。
具体的にはエックスサーバーは以下のとおり。
cd /home/ユーザー名/ドメイン名/public_html/(中略)/cron.phpがあるディレクトリ名/ ; /usr/bin/php7.1 ./cron.php
さくらのレンタルサーバは以下のとおり。 後半の 1> /dev/null はメールが来ないようにする指定。
cd /home/ユーザー名/www/(中略)/cron.phpがあるディレクトリ名/ ; /usr/local/bin/php ./cron.php 1> /dev/null
コアサーバーはシェルスクリプトを実行する形で cron を登録する。 具体的には example.sh など適当なシェルを用意し、コントロールパネルにてシェルのパスを登録する。 具体的にシェルには以下のような PHP を実行するコマンドを書く。
#!/bin/sh /usr/local/bin/php /virtual/ユーザー名/public_html/ドメイン名/(中略)/ファイル名.php
このシェルを実行するように以下のようなcronを登録する。 後半の >/dev/null 2>&1 はメールが来ないようにする指定。
/virtual/ユーザー名/public_html/ドメイン名/(中略)/cron.sh >/dev/null 2>&1