Laravel Cron 定時任務 “跳坑” 點

shjchen發表於2018-10-23

Laravel 中執行定時任務是通過 cron 來實現,官網文件中就是簡單一句 + 一行Cron 程式碼

* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1

但是在實際使用的過程中,如果對 Linux 和 Cron 不熟悉,會遇到一些小坑,我們整理並記錄了分享出來希望能幫助到大家。

坑1:環境變數

Cron無法生效時,可能是Cron執行環境變數不正確引起的。

執行命令

env > /tmp/env.output

開啟/tmp/env.output檔案,將PATH欄位整行新增至corntab檔案頂部,corntab檔案在/var/spool/cron目錄下

crontab 檔案示例

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/mysql/bin:/opt/php7/bin:/opt/memcached/bin:/root/bin
* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1

坑2:Cron 執行使用者導致 Laravel log 不可寫

通過 crontab -e 命令建立的 Cron 是屬於 root 使用者,如果定時任務在實行時主動寫入日誌或者遇到異常未捕捉,會建立 root 許可權的日誌檔案,最終會導致 php-fpmwww 賬號無法寫入。

因此需要在建立 cron 的時候指定使用者

crontab -u www -e

個人管理的系統中 php-fpm 執行使用者都是 www,請根據自己的實際情況調整程式碼。

坑3:cron 內容最後一行未回車

解決上述兩點問題後,如果仍然發現 cron 不執行,請確認

* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1

程式碼最後有進行回車換行。

這個坑坑了工程師一個下午 : (

本作品採用《CC 協議》,轉載必須註明作者和本文連結

公眾號:前程式設計師陳彼得

相關文章