[筆記] 使用其他 User 執行 Cron Job 腳本

以 Laravel 的 php artisan schedule 為例,
如果希望是特定使用者執行的話可以這樣做:

Crontab 部分

在 crontab 中用 su 指定使用者(例如 www),並執行 shell 腳本。

例如在 crontab -e 中:

* * * * * su www -c "/usr/local/bin/laravel-scheduler.sh"

Shell Script 部分

使用 crontab 執行 shell script 時,預設不會載入 .bashrc。

因為我們有使用 PHPBrew 管理多版本的 PHP,
需要手動透過 source 載入環境變數,
才能執行正確的 PHP 版本。

例如在 /usr/local/bin/laravel-scheduler.sh 中:

#!/bin/bash
source ~/.bashrc  # 載入 www 的 bash 環境變數
php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1

其實…

網路上找到一些其他的解決方案,我還沒實際嘗試,有錯誤的話煩請告訴我。

也可以都寫在 Crontab

這樣就不用寫 shell script。

例如在 crontab -e 中:

* * * * * su www -c "source /home/www/.bashrc; <command>"

也可以直接指定 Shell 和環境變數

但這應該會影響到整個 crontab。

例如在 crontab -e 中:

SHELL=/bin/bash
BASH_ENV="/home/www/.bashrc"
* * * * * su www -c "<command>"