Laravel 10调度器在VPS运行NodeJS进程失败,手动执行正常
问题原因
crontab的执行环境与手动登录终端的环境存在差异,它不会自动加载用户的shell配置文件(如.bashrc、.profile),导致Laravel调度器执行时调用的Node版本并非你安装的18.16.1,而是系统默认的旧版本(通常为Node 12或更低)。旧版本Node不支持??空值合并运算符,而jsdom@22.1.0的代码中使用了该语法,因此触发语法错误。
解决办法
1. 使用Node命令的绝对路径
在手动登录的终端中执行which node,获取Node的绝对路径(例如/usr/local/bin/node或~/.nvm/versions/node/v18.16.1/bin/node)。
修改Laravel调度器中执行的Node命令,将node替换为上述绝对路径,例如原命令为node storage/parsers/parser_1/parser_source.js,修改为:
/usr/local/bin/node storage/parsers/parser_1/parser_source.js
2. 在crontab中加载用户环境变量
若不想每次都指定绝对路径,可修改crontab任务配置,在执行Laravel调度命令前加载用户的shell配置文件,确保环境变量被正确读取:
* * * * * root source /root/.bashrc && cd /var/www/stage.betvia.sk/public_html/ && /usr/bin/php artisan schedule:run >> /var/www/stage.betvia.sk/logs/checkscheduler.txt 2>&1
注意:需将/root/.bashrc替换为实际的用户配置文件路径(比如普通用户可能是/home/your_user/.bashrc)。
3. 验证调度器中的Node版本
在Laravel调度任务中添加测试代码,确认调度器使用的Node版本:
use Illuminate\Support\Facades\Process; use Illuminate\Support\Facades\Log; // 测试代码 Process::run('node -v', function ($type, $output) { Log::info('Scheduler Node Version: ' . trim($output)); });
运行后查看日志,确认输出版本为18.16.1。
额外检查项
- 确认
node_modules目录权限:确保Laravel调度器的执行用户(root)对node_modules拥有读取权限,避免因权限问题导致依赖加载失败。 - 核对jsdom版本要求:jsdom@22.x明确要求Node.js >=16.17.0,你的18.16.1版本符合要求,无需调整依赖版本。
内容的提问来源于stack exchange,提问作者Paulis
相关产品推荐
相关产品推荐

