web-dev-qa-db-ja.com

crontabがPHPスクリプトを実行しないのはなぜですか?

結果を確認するために1つのphpファイルを作成したので、cronジョブを設定する必要があります。

結果が送信されるように、30分ごとに実行するように設定しました。ただし、30分ごとにcrontabが実行されなかった理由はわかりません。

Crontabを設定する方法は次のとおりです。

*/30 * * * * php /var/www/html/result.php

ファイルディレクトリが正しいことを確認しました。タイミングの部分についてはわかりません。*/30 * * * *または30 * * * *を使用することはできませんか? */30 * * * *を設定しましたが、機能しませんでした。

13
user941885

与えられた

*/30 * * * * php /var/www/html/result.php

それが機能しない理由は複数あります。

  1. まず、php /var/www/html/result.phpの単純な実行かどうかを確認することが重要です。これは必須です。しかし残念ながら、これを達成しても問題が解決されるわけではありません。

  2. phpバイナリのパスを追加する必要があります。

    */30 * * * * php /var/www/html/result.php
    

    に変更されます

    */30 * * * * /usr/bin/php /var/www/html/result.php
    

    またはwhich phpから来るものは何でも。

  3. Crontabを実行しているユーザーに対するスクリプトの権限を確認してください。

    ファイルに実行権限を付与します:chmod +x file。また、スクリプトを実行する権限を持つユーザーがcrontabを起動していることを確認してください。また、ユーザーがファイルが配置されているディレクトリにアクセスできるかどうかを確認します。

  4. 安全のために、スクリプトの先頭に次のようなphpパスを追加することもできます。

    #!/usr/bin/php -q
    <?php
    
     ...
    
    ?>
    
  5. ユーザーがcrontabを使用する権限を持っていることを確認してください。彼が/etc/cron.d/denyファイルにいるかどうかを確認します。また、基本的なテストを行って、それがcrontanbまたはphpの問題であるかどうかを確認します。

    * * * * * touch /tmp/hello
    
  6. スクリプトの結果をログファイルに出力します。 William Niuが提案

    */30 * * * * /usr/bin/php /var/www/html/result.php > /tmp/result
    
  7. -fオプションを使用して、スクリプトを実行します。

    */30 * * * * /usr/bin/php -f /var/www/html/result.php > /tmp/result
    
  8. Crontabの形式が正しいことを確認してください。たとえば、サイト Crontab.gur を使用してこれを行うことができます。


要約すると、考えられる理由はたくさんあります。それらの1つは問題を解決する必要があります。

Phpがパスにないことが原因である可能性があります。 crontabpathはごくわずかです。したがって、phpプログラムのフルパスを含めてください。

出力をファイルにパイプすることでcronコマンドをテストできます。

*/30 * * * * php /var/www/html/result.php > /tmp/result.log

このリファレンスページ から、「Crontab環境」の下:

cronは、シェル(/ usr/bin/sh)を使用してユーザーのHOMEディレクトリからコマンドを呼び出します。 cronは、すべてのシェルにデフォルト環境を提供し、以下を定義します。

HOME=user’s-home-directory 
LOGNAME=user’s-login-id
PATH=/usr/bin:/usr/sbin:. 
Shell=/usr/bin/sh

また、/30構文はすべてのプラットフォームでサポートされているとは限らないため、代わりに0,30に変更してみてください。

7
William Niu

同様の問題がありました。コマンドラインからは機能しましたが、cronからは機能しませんでした。

私のphpコードにdbのものの "include(" ./ connect.php ");がありました。

それを削除し、connect.phpコードをphpスクリプトに直接追加すると、cronから機能しました。

6
Willem Abrie

私はこれに関して面白いものを持っていました。私のスクリプトは手動で実行されますが、crontabからは実行されません。

スクリプトはファイルの場所ではなく/usr/bin/phpから実行されていたため(手動で実行した場合のように)、私のphp requireは必要なファイルを見つけられませんでした。完全なアドレスを反映するように変更すると、修正されました。

/usr/bin/php -f /var/www/myfile.phpとしてスクリプトを実行することによるトラブルシューティングは、問題を見つけるのに役立ちました

5
KingColours

Ubuntu 14.04.1でも同様の問題が発生しましたが、問題はcrontabを変更する方法であることが判明しました。

Sudo crontab -eだけでなくcrontab -eを使用していたため、変更が無視されました。

5
nifo

スクリプトが直接機能する理由(メールでGmailアカウントにデータを送信するため)に戸惑った1日後、URLをクリックすると、すべての意図的な送信が機能し、すべてのcron送信がスパムになっていることがわかりました。理由はわかりませんが、共有したいと思いました。

1
Brian Jones

実行されていませんか? execを使用する場合は、cronから実行しており、すべてのフルパスが必要であることに注意してください。したがって、cpの代わりに、/bin/cpを使用する必要があります。

0
Trygve

*/30 * * * * wget http://my.domain.com/path/to/php/result.phpを使用できます

ただし、Crontabは、crontab -eを実行した現在のユーザーを使用してタスクを実行します。 wgetを使用する場合、www-dataユーザー/グループペアを使用してApacheによって処理されます

  1. まず、スクリプトが期待どおりに機能することを確認します。

    $ php /var/www/html/result.php
    
  2. 次に、Apacheユーザーアカウントのcrontabを編集します

    $ Sudo crontab -u www-data -e
    

    または

    $ Sudo crontab -u root -e
    
  3. 次に、crontabを追加し、ログファイルに出力します。

    */30 * * * * php /var/www/html/result.php > /tmp/result.log
    
0
Optimaz ID

ウィレムの答えは私に道を示した。私の場合、コード内に「include( "connection.php")」があります。 connection.phpを/my/full/path/connection.phpに変更しました。相対パスを使用したrename()呼び出しがいくつかあり、絶対パスに変更しました。それは私のために働いた。私はそれが他の誰かを助けることができることを願っています。

0
Paulo

簡単で論理的な方法:

/ var/log/cronでcronログを確認すると、非常に役立つ情報が得られます。

少ない/ var/log/cron

例えば。、

私のcronエントリは* * * * * /usr/bin/php /cat.php <==毎分cat.phpを実行する

ログファイルには、cronエントリが実行されるたびに、以下のようなエントリが含まれます。

Jan 24 08:06:01 OlaTower CROND[13641]: (root) CMD (/usr/bin/php /cat.php)    
Jan 24 08:07:01 OlaTower CROND[13641]: (root) CMD (/usr/bin/php /cat.php)

ここでは、phpコマンドが毎分実行され、ログファイルに毎分エントリがあります。

エントリがない場合、crondはそのcronジョブを選択していません。ログエントリがあり、それでも目的の出力が得られない場合は、コマンド/アプリケーションロジックに問題があります。

0
Siva Prakash