5

順次実行する必要があるさまざまなタスクを実行する 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)

私が試してみたいことについての提案をいただければ幸いです。

4

1 に答える 1

2

予備

  • crontab でSHELLとの値がPATH正しく設定されていることを確認します。例:

    SHELL=/bin/bash
    PATH=/bin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/local/sbin:/usr/sbin
    
    • 意図したシェル (bash など) が実際に使用されていることを確認してください。
    • 必要なすべてのバイナリが、示されている 経由でアクセスできることを確認してくださいPATH
  • %crontab にエスケープされていないものがないことを確認してください。詳細man 5 crontabについては、を参照してください。
  • おそらく、環境変数もMAILTO適切な値に設定します。たとえば、次のようになります。

    MAILTO="webmaster@example.com"
    

crontab が機能していることを確認する

crontabが正しく解析されるようにするためのもう 1 つの小さなトリックは、末尾にマーカーエントリを追加することです。

私はこのマーカーエントリを自分で使用しています

@daily logger -p local0.notice -t CRON '$Id: demo 7029 2012-11-27 09:27:39Z dirk $'

マーカー エントリが syslog にない場合は、 crontabが破損していることがわかります。これは、見たことのない奇妙な構文エラーが原因である可能性があります。

cron ジョブをデバッグする方法

cron ジョブが機能しない場合は、最初にジョブの出力を調査してください。

crontab を次のように変更します。

0 1 * * * /bin/bash -x /var/www/example.com/processors/run.sh >>/tmp/cronTrace 2>&1

生成されたスクリプト出力をトレース出力 ( ) と合わせて調査してくださいbash -x

追記事項

chmod +x $SCRIPT
$PHP $SCRIPT

このchmod手順は不要であり、避ける必要があります。次の行では、インタープリター コマンドを明示的に使用してスクリプトを呼び出します。

于 2013-03-11T12:16:38.280 に答える