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

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 start app-fm.js --cwd /root/wa-bot --name app-fm
    
    如果使用PM2 ecosystem配置文件管理应用,直接在对应应用配置项中添加cwd: '/root/wa-bot'字段即可,配置后PM2重启、开机自启都不会出现工作目录错乱问题。
  • 方案2:代码层面固定目标文件绝对路径(一劳永逸,不受启动方式影响)
    修改app-fm.js中传入forever-monitor的路径,用Node.js内置path模块结合__dirname(永远指向当前脚本所在的目录,不受工作目录影响)拼接绝对路径:
    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()
    
    修改后无论从哪个目录执行启动命令,forever-monitor都能准确定位到app.js的位置。
  • 方案3:启动前手动切换到项目目录(仅临时调试可用,不推荐生产使用)
    执行PM2启动命令前先cd到项目根目录:
    cd /root/wa-bot && pm2 start app-fm.js --name app-fm
    
    这种方式在PM2触发自动重启、服务器重启后PM2自动拉取应用时,大概率会因为工作目录重置再次触发相同报错,不建议长期使用。

内容的提问来源于stack exchange,提问作者learntheropes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:12:32