[解決済み]cronが動かない!
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年のものだったが解決できて本当に良かった。感謝感激。
他にも、「macOSでは設定からcronのフルアクセス許可が必要」という記事をいくつか見たが、結局cronもcrontabもフルアクセスをオフにしても問題なく動いていた。
これに関しては俺の用途では関係のないものだったようだ。
Discussion