php – Laradock – 使用 crontab 自動執行會出現 exec: composer: not found 的問題

2023-01-18 修正

Laravel 我寫了一隻 command,透過 schedule 註冊每個小時都要跑這隻程式

protected function schedule(Schedule $schedule)
{
    $schedule->command("deploy")->hourly()->unlessBetween('01:00', '07:00');
}

透過指令

php artisan schedule:run

確實可以執行如 “git pull”, “composer install”, “php artisan optimize”, “npm install” …… 但是透過 crontab 卻會異常,顯示 “exec: composer: not found” 找不到指令的問題。

方法 (一)

docker-compose exec workspace bash
vim /etc/cron.d/laradock

PATH: 羅列出 shell 搜尋 使用者 輸入的執行命令所在的目錄

# 加入這行
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”

vim workspace/crontab/laradock
# * * * * * laradock /usr/bin/php /var/www/artisan schedule:run >> /dev/null 2>&1

接著跑起所需要的環境

docker-compose build workspace php-fpm
docker-compose up -d nginx mongo redis

進入 workspace 修改 crontab

docker-compose exec workspace bash

# 我們確定使用者身份 laradock 已經被註解掉了
vim /etc/cron.d/laradock

# 增加 root
vim /etc/crontab

添加這行

* * * * * root cd /var/www && php artisan schedule:run >> /dev/null 2>&1

這樣就能使用 root 身份執行 schedule 了。

如果已經 Build

註腳掉原本使用者 laradock 的 crontab

docker-composer exec workspace bash
vim /etc/cron.d/laradock
# * * * * * laradock /usr/bin/php /var/www/artisan schedule:run >> /dev/null 2>&1

增加 root 的 crontab

vim /etc/crontab
* * * * * root cd /var/www && php artisan schedule:run >> /dev/null 2>&1

這樣就可以了。

如果有用到 Git Pull ,因為是自動化的關係,因此要使用 ssh ,請參考這篇網友分享的文章,設定不需要打帳號密碼的方式。

發表迴響