Cron执行Node脚本出现ENOENT文件不存在错误的解决求助
解决Crontab执行Node脚本找不到SQL文件的问题
问题概况
- Crontab执行命令:
usr/bin/node /services/integration/build/index.js - 报错信息:
Error: ENOENT: no such file or directory, open './sql/search.sql' - 项目目录结构:
integration/ ├── build/ ├── sql/ └── src/ - 直接进入
/services/integration/目录执行node build/index.js可正常运行,移动sql文件夹无法解决问题。
核心原因
Crontab默认的工作目录是执行用户的主目录(如root用户为/root),而非你的项目根目录/services/integration/。代码中使用的相对路径./sql/search.sql会基于Crontab的工作目录解析,自然找不到目标文件;而手动在项目目录执行时,当前工作目录是项目根目录,相对路径解析正确。
解决方案
方案1:Crontab中先切换工作目录再执行脚本
修改Crontab命令,先进入项目根目录,再运行Node脚本(注意修正原命令中usr/bin/node的路径错误,应为/usr/bin/node):
* * * * * cd /services/integration && /usr/bin/node build/index.js
方案2:代码中使用绝对路径访问文件
在Node.js代码里,利用__dirname(当前脚本所在目录的绝对路径)拼接SQL文件的绝对路径,避免依赖工作目录:
const path = require('path'); // __dirname 对应 /services/integration/build/,向上一级拼接sql目录 const sqlFilePath = path.join(__dirname, '../sql/search.sql'); // 使用sqlFilePath进行文件读取操作
方案3:Crontab中指定工作目录
通过Crontab的环境变量设置工作目录,比如:
* * * * * HOME=/services/integration /usr/bin/node build/index.js
不过方案1的cd方式更直观易懂,优先推荐。
内容的提问来源于stack exchange,提问作者João Pedro
相关产品推荐
相关产品推荐

