我在 Windows 上使用 PM2(节点进程管理器),需要同时运行两个单独的 PM2 安装(均处于集群模式)。
我有两个完全分开(隔离)的安装目录,它们有自己的:
顺便说一句:安装目录是可移植的,因此没有共享文件或注册表项等。
当我仅启动一个 PM2 实例时,一切正常(子工作实例附加到运行 PM2 的节点进程)。这对于两种安装都适用。
但是,如果我启动两个 PM2 实例(一个接一个,无论按什么顺序),第二个实例将启动 PM2 的正确(第二个)节点进程,但随后将子工作实例附加到第一个实例的节点进程PM2安装。
这是 Windows 版 PM2 中的错误还是我错过了什么? 第二个 PM2 实例究竟如何识别第一次安装中已运行的节点进程,以及如何避免它,以便两个 PM2 进程与其自己的子工作实例单独运行?
感谢您的帮助。
找到解决方案,PM2在Windows下运行时,其源文件paths.js有一个错误(即使使用单独的PM2_HOME环境变量,独特的内存中命名管道也可以识别已运行的守护进程的套接字)。他们甚至有一条待办事项评论说他们应该修复它......
当前代码:
if (process.platform === 'win32' ||
process.platform === 'win64') {
//@todo instead of static unique rpc/pub file custom with PM2_HOME or UID
pm2_file_stucture.DAEMON_RPC_PORT = '\\\\.\\pipe\\rpc.sock';
pm2_file_stucture.DAEMON_PUB_PORT = '\\\\.\\pipe\\pub.sock';
pm2_file_stucture.INTERACTOR_RPC_PORT = '\\\\.\\pipe\\interactor.sock';
}
固定代码(只是一种可能的修复方法):
if (process.platform === 'win32' ||
process.platform === 'win64') {
//@todo instead of static unique rpc/pub file custom with PM2_HOME or UID
pm2_file_stucture.DAEMON_RPC_PORT = '\\\\.\\pipe\\' + process.env['PM2_HOME'] + '\\rpc.sock';
pm2_file_stucture.DAEMON_PUB_PORT = '\\\\.\\pipe\\' + process.env['PM2_HOME'] + '\\pub.sock';
pm2_file_stucture.INTERACTOR_RPC_PORT = '\\\\.\\pipe\\' + process.env['PM2_HOME'] + '\\interactor.sock';
}
我还发现了这个报告的问题:https://github.com/Unitech/pm2/issues/5212