DigitalOcean Droplet中PM2运行forever-monitor报脚本不存在错误
报错根本原因
问题出在相对路径解析依赖进程工作目录,不同启动方式的工作目录不一致:
- 手动在项目目录
/root/wa-bot下执行node app-fm.js时,进程的工作目录就是项目根目录,forever-monitor解析传入的相对路径app.js时,会直接在/root/wa-bot下查找文件,路径匹配所以运行正常。 - 用PM2托管启动时,如果没有显式指定工作目录,PM2默认会以当前执行用户的家目录
/root作为进程工作目录,此时forever-monitor查找app.js的实际路径为/root/app.js,和文件实际存放路径/root/wa-bot/app.js不匹配,直接触发文件不存在的报错。
本地开发环境运行正常也是同理,本地启动时不管是手动执行还是本地托管,工作目录默认都是项目根目录,不会出现路径解析错误。
修复方案
按推荐优先级排序:
- 方案1:PM2启动时显式指定工作目录(无需修改业务代码,最推荐)
启动命令中添加--cwd参数明确指定项目根目录即可:
如果使用PM2 ecosystem配置文件管理应用,直接在对应应用配置项中添加pm2 start app-fm.js --cwd /root/wa-bot --name app-fmcwd: '/root/wa-bot'字段即可,配置后PM2重启、开机自启都不会出现工作目录错乱问题。 - 方案2:代码层面固定目标文件绝对路径(一劳永逸,不受启动方式影响)
修改app-fm.js中传入forever-monitor的路径,用Node.js内置path模块结合__dirname(永远指向当前脚本所在的目录,不受工作目录影响)拼接绝对路径:
修改后无论从哪个目录执行启动命令,forever-monitor都能准确定位到var forever = require('forever-monitor') const path = require('path') const fm = new(forever.Monitor)(path.join(__dirname, 'app.js'), { max: 1, silent: false, }) fm.start()app.js的位置。 - 方案3:启动前手动切换到项目目录(仅临时调试可用,不推荐生产使用)
执行PM2启动命令前先cd到项目根目录:
这种方式在PM2触发自动重启、服务器重启后PM2自动拉取应用时,大概率会因为工作目录重置再次触发相同报错,不建议长期使用。cd /root/wa-bot && pm2 start app-fm.js --name app-fm
内容的提问来源于stack exchange,提问作者learntheropes
相关产品推荐
相关产品推荐

