Crontab运行Node脚本失败:目录外执行无法读取.env配置参数
问题原因
你遇到的报错本质是工作目录不匹配导致的:dotenv等.env加载库默认会从执行命令时的当前工作目录读取.env文件,你在crontab中直接执行node ~/ls-mongo/updateItems.js时,crontab的默认工作目录是当前用户的根目录,找不到存放在~/ls-mongo/下的.env文件,自然就加载不到配置参数。而你进入脚本目录执行时,工作目录和.env存放目录一致,所以运行正常。
解决方案
方案1(最常用,无需修改代码)
直接修改crontab定时规则,执行脚本前先切换到对应目录:
# 编辑crontab crontab -e # 将原规则替换为以下内容 */5 * * * * cd ~/ls-mongo && node updateItems.js
方案2(无需修改crontab,一劳永逸)
修改updateItems.js中dotenv的加载逻辑,指定.env的绝对路径,不管从哪个目录执行都能正确加载:
把原有的加载代码
require('dotenv').config()
替换为:
require('dotenv').config({ path: require('path').resolve(__dirname, '.env') })
其中__dirname是Node.js内置变量,指向当前js文件所在的目录。
额外注意事项
- 如果crontab执行时提示找不到node命令,可以先用
which node查询node的绝对路径,把命令中的node替换为绝对路径即可,例如查询到路径为/usr/local/bin/node,则规则改为:*/5 * * * * cd ~/ls-mongo && /usr/local/bin/node updateItems.js - 建议加上日志输出方便后续排查问题,修改规则如下:
所有执行输出和报错都会写入*/5 * * * * cd ~/ls-mongo && node updateItems.js >> ~/cron_exec.log 2>&1~/cron_exec.log文件。
内容的提问来源于stack exchange,提问作者Darryl Morley
相关产品推荐
相关产品推荐

