php – Laradock – 使用 crontab 自動執行會出現 exec: composer: not found 的問題
2023-01-18 修正
Laravel 我寫了一隻 command,透過 schedule 註冊每個小時都要跑這隻程式
1 2 3 4 5 6 |
protected function schedule(Schedule $schedule) { $schedule->command("deploy")->hourly()->unlessBetween('01:00', '07:00'); } |
透過指令
1 2 3 |
php artisan schedule:run |
確實可以執行如 “git pull”, “composer install”, “php artisan optimize”, “npm install” …… 但是透過 crontab 卻會異常,顯示 “exec: composer: not found” 找不到指令的問題。
方法 (一)
1 2 3 4 |
docker-compose exec workspace bash vim /etc/cron.d/laradock |
PATH: 羅列出 shell 搜尋 使用者 輸入的執行命令所在的目錄
1 2 3 4 5 6 7 |
# 加入這行 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/var/www/vendor/bin # 下面這行不變 * * * * * laradock /usr/bin/php /var/www/artisan schedule:run >> /dev/null 2>&1 |
這樣就能順利運行了!
方法 (二) 不建議使用了,僅作參考
以下兩種方法
如果是還沒 Build 專案
首先 Laradock 的專案資料夾會看到 workspace/crontab/laradock,已經寫好了每分鐘執行 php artisan,把它註解掉,因為這個身份是 “laradock”,我們要使用的是 “root”
1 2 3 |
vim workspace/crontab/laradock |
1 2 3 |
# * * * * * laradock /usr/bin/php /var/www/artisan schedule:run >> /dev/null 2>&1 |
接著跑起所需要的環境
1 2 3 4 |
docker-compose build workspace php-fpm docker-compose up -d nginx mongo redis |
進入 workspace 修改 crontab
1 2 3 4 5 6 7 8 9 |
docker-compose exec workspace bash # 我們確定使用者身份 laradock 已經被註解掉了 vim /etc/cron.d/laradock # 增加 root vim /etc/crontab |
添加這行
1 2 3 |
* * * * * root cd /var/www && php artisan schedule:run >> /dev/null 2>&1 |
這樣就能使用 root 身份執行 schedule 了。
如果已經 Build
註腳掉原本使用者 laradock 的 crontab
1 2 3 4 |
docker-composer exec workspace bash vim /etc/cron.d/laradock |
1 2 3 |
# * * * * * laradock /usr/bin/php /var/www/artisan schedule:run >> /dev/null 2>&1 |
增加 root 的 crontab
1 2 3 |
vim /etc/crontab |
1 2 3 |
* * * * * root cd /var/www && php artisan schedule:run >> /dev/null 2>&1 |
這樣就可以了。
如果有用到 Git Pull ,因為是自動化的關係,因此要使用 ssh ,請參考這篇網友分享的文章,設定不需要打帳號密碼的方式。