You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 02:52:11