Docker Ubuntu环境下Laravel Cron任务报错:php未找到
解决Docker Ubuntu镜像中Laravel Cron任务找不到PHP的问题
问题复现
在crontab -e中配置的定时任务:
0,30 * * * * cd /usr/local/bin && php /var/www/artisan my_command > /var/www/storage/logs/cron.log 2>&1
执行后日志报错:
/bin/sh: 1: php: not found
已知信息:
which php返回/usr/local/bin/php- 当前用户为root
- 运行环境是Docker Ubuntu镜像中的Laravel项目
核心原因
Cron的执行环境是极简模式,默认的PATH环境变量不包含/usr/local/bin这类非系统默认目录,所以即使你在交互式shell里能正常调用php命令,Cron进程找不到对应的可执行文件。
解决方案
方案1:直接使用PHP的绝对路径
把任务中的php替换为which php返回的绝对路径,同时可以简化cd操作(不需要切换到/usr/local/bin):
0,30 * * * * cd /var/www && /usr/local/bin/php artisan my_command > /var/www/storage/logs/cron.log 2>&1
方案2:在Crontab中配置PATH环境变量
在crontab -e的最顶部添加PATH配置,包含PHP所在的目录:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 0,30 * * * * cd /var/www && php artisan my_command > /var/www/storage/logs/cron.log 2>&1
这样Cron执行任务时就会使用指定的PATH,能正常找到php命令。
方案3:验证Docker中Cron的运行环境(可选排查)
如果以上方案无效,可以临时添加一个Cron任务查看实际的PATH:
* * * * * echo $PATH > /var/www/storage/logs/path.log
等待1分钟后查看path.log,确认Cron实际使用的PATH是否包含/usr/local/bin,再针对性调整。
内容的提问来源于stack exchange,提问作者The Blind Hawk
相关产品推荐
相关产品推荐

