順次実行する必要があるさまざまなタスクを実行する 4 つの PHP スクリプトがあります。
PHP スクリプトごとに cron エントリを作成する代わりに、私は賢く、以下のように Bash スクリプトとしてまとめることにしました。
#!/bin/bash
# set notification email.
NOTIFYEMAIL="webmaster@example.com"
# set PHP path.
PHP="$(which php)"
# set folder path.
FOLDER="/var/www/example.com/processors/"
# list of scripts.
SCRIPTS=("script_1" "script_2" "script_3" "script_4")
# execute each script.
for i in "${SCRIPTS[@]}"
do
SCRIPT="$FOLDER/$i.php"
printf "Processing: %s\n" $i
chmod +x $SCRIPT
$PHP $SCRIPT
done
echo "Scripts have been processed." | mail -s "Scripts Processed" $NOTIFYEMAIL
すべてのスクリプトを個別にテストしましたが、エラーなく動作し、処理情報を端末に出力しています。
/usr/bin/php /var/www/example.com/processors/script_1.php
4 つの PHP スクリプトを順番に呼び出す bash スクリプトをターミナルから手動でテストしましたが、これもエラーなしで動作します。
/bin/bash /var/www/example.com/processors/run.sh
しかし、何らかの理由で、 rootユーザーの crontabで以下を使用して実行するために cron を離れると、PHP スクリプトが実行されません。
# process daily.
0 1 * * * /bin/bash /var/www/example.com/processors/run.sh > /dev/null
crontab が処理され、Bash スクリプトが実行されたことがわかります。これは、毎回、スクリプトの最後に常に通知の電子メールを受信しているためです。
権限は次のとおりです。
-rwxr-xr-x 1 root root 510 Mar 11 09:21 run.sh
-rwxrwxr-x 1 git git 2.8K Mar 8 10:17 script_1.php
-rwxrwxr-x 1 git git 2.6K Mar 1 18:07 script_2.php
-rwxrwxr-x 1 git git 717 Mar 1 18:07 script_3.php
-rwxrwxr-x 1 git git 6.8K Mar 4 16:30 script_4.php
次のような cron 固有のログ ファイルはありません/var/log/cron.log
が、実行するgrep CRON /var/log/syslog
と次の一般的な出力が返されます。
Mar 11 06:39:01 s00000000 CRON[11651]: (root) CMD ( [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete)
Mar 11 07:09:01 s00000000 CRON[12771]: (root) CMD ( [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete)
Mar 11 07:17:01 s00000000 CRON[13074]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
私が試してみたいことについての提案をいただければ幸いです。