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

基于PM2运行的NodeJS应用每日更新JSON文件无需手动重载方案问询

方案1:应用层动态读取JSON(无重启,最优雅)

问题根源是你的Node服务默认仅在启动时一次性读取JSON文件到内存,后续文件变更不会同步到内存数据,才需要重启进程更新。直接修改应用代码监听JSON文件变更自动更新内存缓存即可,全程不需要重启服务,无任何业务中断。
示例实现代码:

const fs = require('fs')
const path = require('path')
// 替换为你的JSON文件实际路径
const TARGET_JSON_PATH = path.resolve(__dirname, './data.json')

// 初始化加载数据
let cachedJsonData = JSON.parse(fs.readFileSync(TARGET_JSON_PATH, 'utf-8'))

// 监听JSON文件变更,自动更新缓存
fs.watch(TARGET_JSON_PATH, (event) => {
  if (event === 'change') {
    try {
      const newData = JSON.parse(fs.readFileSync(TARGET_JSON_PATH, 'utf-8'))
      cachedJsonData = newData
      console.log('JSON数据已自动更新')
    } catch (err) {
      console.error('JSON文件解析失败,沿用旧数据:', err.message)
    }
  }
})

// 后续业务接口直接返回 cachedJsonData 即可

方案2:PM2自带文件监听自动重启(无需修改应用代码)

如果不想改动应用代码,可以直接使用PM2原生的文件监听功能,指定仅监听目标JSON文件的变更,文件更新后PM2会自动执行重载操作,不需要手动输入命令。

两种配置方式:

  • 命令行直接启动时添加参数:
    pm2 start 你的应用入口文件.js --watch /path/to/你的数据文件.json
  • 使用PM2配置文件(ecosystem.config.js)的话,添加如下配置:
module.exports = {
  apps: [{
    name: '你的应用名称',
    script: 'app.js',
    // 仅监听目标JSON文件,避免其他文件变更误触发重启
    watch: ['/path/to/你的数据文件.json'],
    ignore_watch: ['node_modules', 'logs'],
    // 防抖配置,1秒内多次变更仅触发一次重启
    watch_delay: 1000
  }]
}

配置完成后执行pm2 start ecosystem.config.js启动即可。

方案3:Cron任务追加重载命令(最低改造成本)

如果以上两种方案都不适用,直接修改你的系统定时任务,在CURL拉取JSON成功之后追加PM2重载命令即可,注意要使用命令的绝对路径避免cron环境变量找不到执行文件。
示例cron配置:
0 12 * * * /usr/bin/curl 你的数据拉取地址 -o /path/to/你的数据文件.json && /usr/local/bin/pm2 reload 你的应用名称

可执行which pm2查询你环境中PM2的实际绝对路径替换上面的示例路径,同时要保证cron执行用户和启动PM2的用户一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:45:05