【问题标题】:Proper way to update PM2 after updating Node.js更新 Node.js 后更新 PM2 的正确方法
【发布时间】:2022-01-06 09:44:24
【问题描述】:

将 Node.js 从 v10.16 更新到 v10.32 后,未检测到 PM2,但使用 ps aux 检查时运行正常。即使在系统重新启动时,PM2 也能正常运行,即使手动 PM2 命令导致以下类型的错误。

pm2 列表 pm2:找不到命令

将 Node.js 切换回 10.16,PM2 命令再次可用。仅供参考 PM2 最初安装在 v10.16 下。

虽然在 v10.32 中尝试了 PM2 install 命令 npm install pm2 -g 但必须使用命令 npm install pm2 -g --unsafe-perm 才能运行。

Node.js v10.16 现在运行 PM2 v10.1。 Node.js v10.32 现在运行 PM2 v10.8。

这是保持 PM2 版本同步并处理节点升级/更改的正确方法吗?安装每个新版本的 Node 后是否需要执行此操作?

【问题讨论】:

    标签: node.js pm2


    【解决方案1】:

    更新node.js版本后不要忘记重建包:

    cd /to/root/of/your/project
    npm rebuild
    npm i -g pm2 && pm2 update
    
    # here 0 and dist/main.js change for your project
    pm2 delete 0 && pm2 start dist/main.js
    

    【讨论】:

      【解决方案2】:

      似乎没有办法在节点更新后重新安装 PM2 :-(

      $ nvm install 6.11.3 --reinstall-packages-from=6.11.2 && nvm alias default 6.11.3
      $ nvm uninstall 6.11.2
      $ pm2 update # Update in memory pm2
      $ pm2 startup
      $ nano /etc/init.d/pm2-init.sh  # Wrong path :-(
      

      但是重新安装 pm2 是不够的,有些东西即使看起来可以工作,仍然会损坏,例如日志不再是实时的 我的热修复:

      $ rm -rf /root/.pm2
      $ pm2 reload pm2.json --env production
      $ pm2 startup ubuntu
      

      【讨论】:

        【解决方案3】:

        当你切换node版本时,你也切换了包,所以你需要在node update时重新安装pm2。幸运的是,这种情况并不经常发生。

        你可以制作一个 shell sript 一次性完成这两件事。

        对于 unsafe-perm,只有当您以 root 身份安装 pm2 时才会出现。当您认为 pm2 对您的机器进程有相当多的控制时,这是有道理的。

        【讨论】:

        • 那么我认为作为守护进程运行的 PM2 正在控制更新的节点 v10.32 中的程序,但 pm2 功能在重新安装 pm2 软件包之前无法访问,这是否正确?或者 PM2 是否仍然以某种方式连接并在 Node v10.16 中运行受其控制的程序,直到包更新?感谢您及时的回复。内尔斯
        【解决方案4】:

        在控制台中:

        1. pm2 save --首先确保您正确保存了所有进程
        2. npm install pm2 -g --然后从NPM安装最新的PM2版本
        3. pm2 update --最后更新内存中的PM2进程

        【讨论】:

          【解决方案5】:

          我尝试了很多次不同的组合,但似乎仍然不是很稳定和智能的解决方案。因此,我列出了一些我能想到的逻辑,您可以在升级和编写脚本时应用并监控结果。

          基本上在我的情况下,我们有一堆应用程序Node下运行。因此,当您需要 PM2 启动同样安装在 Node Version Managers 下的另一个应用程序时,事情变得复杂起来,例如 NVM

          例如。我有

          nvm ls
          ->     v14.17.6
          

          PM2 安装在:

          which pm2
          ~/.nvm/versions/node/v14.17.6/bin/pm2
          

          因为我使用的是 App1(一个由 npm 管理的 NodeJS 应用程序)。我得到了:

          which App1
          ~/.nvm/versions/node/v14.17.6/bin/App1
          

          所以每次我使用 nvm 升级时:

          nvm install --lts --reinstall-packages-from=14 --latest-npm
          

          然后 nvm 在此控制台中使用更新的版本。例如14.7.999999

          也许我(大多数时候)需要在同一维护时段升级我的 PM2 和其他应用程序,我使用 ncuncu -g 并升级它们。

          现在,应用程序以全新版本结束。前任。一个新的 PM2 实例(本地)和一个在旧节点文件夹中运行(在内存中)与旧的消费者应用程序 (App1) 的旧 PM2。新版本的 App1 现在存在于新的 Node 应用程序文件夹中,但未运行。

          In memory PM2 version: 5.1.0
          Local PM2 version: 5.1.1
          

          无论如何,如果您没有升级版的 PM2,您可能仍在寻找安装在新 Node 文件夹下的 PM2 的新路径。如果没有,您可以使用升级后的节点重新安装 PM2

          npm i -g pm2
          

          更糟糕的是 PM2 在系统启动脚本中,需要重新编写。例如。

          /etc/systemd/system/pm2-xx.service

          所以我最终消失了所有应用程序:

          pm2 stop app1 && pm2 delete app1
          pm2 stop app2 (verdaccio json startup config) && pm2 delete app2
          ...
          pm2 stop appN && pm2 delete appN
          

          然后做:

          pm2 update
          

          切换到新的 PM2 实例

          然后重新配置所有应用程序

          pm2 start app1, app2, ... appN
          

          那就做吧

          pm2 update 
          

          要更新应用程序列表,请检查是否使用了正确的节点路径。

          如果所有应用程序路径都已更正 做

          pm2 startup systemd
          

          并复制并运行建议的启动脚本

          sudo env PATH=$PATH:/....
          

          终于运行

          pm2 save
          

          在启动时冻结列表。

          【讨论】:

            猜你喜欢
            • 2018-05-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-04
            • 2017-11-01
            • 2012-09-04
            • 1970-01-01
            相关资源
            最近更新 更多