[解決済み]cronが動かない!

2024/12/05に公開
環境
macOS Sequoia 15.0.1
Laravel 11.27.2

何があったのか

Laravelのタスクスケジュール機能をcronで定期実行させようとしたが動いてくれない…。

結論

crontabに追加したコマンドのミスだった。
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
これを
* * * * * cd /path-to-your-project && /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1
とすることで動いてくれた。

変更点: php/usr/local/bin/php

詳細

Readoubleを読んだところ、crontabに追加するコマンドは以下の通り
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

  • * * * * *
    時間指定(左から分、時、日、月、曜日)
  • cd /path-to-your-project
    どのパスで実行するかを設定(フルパスでなくてはならない)
  • && php artisan schedule:run
    実行したいコマンド
  • >> /dev/null 2>&1
    ここはよくわからないが、出力結果(ログ、エラーなど)を出力せず破棄するものらしい

しかしこのままだと動かなかったため、いろいろ調べてログを出力してみることに。
(/dev/null~/cron.logに変更(ホームディレクトリにlogを出力))

すると/bin/sh: php: command not foundというエラーがログに出力された。
ログ「phpなんていうコマンドは無いから実行できなかったよ!」
…そんなこと言われても…いつもそのパスでphp artisan serveとか動いてくれてたじゃん!!
なんならphp artisan schedule:runだってターミナルでは動いてくれてたし…。

「ターミナルでは」………そう、ターミナルではphpにコマンドとしてパスが通っているので使えるが、cronではパスが通っていないためphpをコマンドとして認識できなかったのである…!(ちゃんと理解できてない)

これを解決するために、phpコマンドまでのフルパス(俺の環境では/usr/local/bin/php)を使う必要があったようだ。
最終的には* * * * * cd /path-to-your-project && /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1これで動くようになった。


参考にさせていただいた記事が2011年のものだったが解決できて本当に良かった。感謝感激。
https://dacelo.space/linux/entry-943.html

他にも、「macOSでは設定からcronのフルアクセス許可が必要」という記事をいくつか見たが、結局cronもcrontabもフルアクセスをオフにしても問題なく動いていた。
これに関しては俺の用途では関係のないものだったようだ。

Discussion