Nodejs forever 运行后 后台发现两个node 服务

Nodejs forever 运行后 后台发现两个node 服务

如题 nohup 是一个

为什么forever 是两个node 服务呢?

6 回复

Node.js Forever 运行后后台发现两个 Node 服务

问题描述

使用 forever 运行 Node.js 应用时,发现后台有两个 Node.js 服务正在运行。这是为什么呢?

解释

通常情况下,使用 forever 运行 Node.js 应用时只会启动一个进程。如果你发现有两个 Node.js 服务在运行,可能是因为以下几种情况:

  1. 多次启动:你可能不小心执行了两次 forever start 命令。
  2. 配置文件:你的应用中可能存在多个入口点或配置文件,导致 forever 启动了多个实例。
  3. 并发模式:某些情况下,forever 可能以并发模式启动多个实例。

示例代码

假设你有一个简单的 Node.js 应用 app.js

// app.js
const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello World\n');
});

const port = process.env.PORT || 3000;
server.listen(port, () => {
  console.log(`Server running at http://localhost:${port}/`);
});

使用 Forever 启动应用

你可以通过以下命令启动应用:

forever start app.js

如果发现有两个 Node.js 服务在运行,可以通过以下命令查看当前的 forever 进程:

forever list

这将显示所有由 forever 管理的进程及其状态。

检查并解决问题

  1. 检查是否有多次启动

    ps aux | grep node
    
  2. 检查配置文件: 确保你的 app.js 文件没有包含多个启动逻辑。

  3. 使用唯一标识符: 如果你需要启动多个实例,可以为每个实例指定不同的标识符:

    forever start -a --uid "instance1" app.js
    forever start -a --uid "instance2" app.js
    
  4. 查看日志文件: 查看 forever 的日志文件,了解启动过程中的详细信息:

    tail -f ~/.forever/*.log
    

通过以上步骤,你应该能够找出为什么 forever 启动了两个 Node.js 服务,并解决这个问题。


我没描述清楚还是?我启动参数不对呢?

node a.js

然后 top 这时会有一个node服务

forever start a.js 然后看 后台中有两个node 服务

正常吗?

linux 64位

process.title = 'your app name'之后再看是否your app name存在两个,因为forever自己也是master角色的node进程,用来重启、管理托管的进程

有一个forever自己的守护进程吧

还有待研究 。。。。

当使用 forever 运行 Node.js 应用程序时,后台出现两个 node 进程可能是因为某些配置或脚本导致的。通常情况下,forever 会启动一个 Node.js 进程来运行你的应用程序。如果你看到有两个 node 进程,这可能是由于以下原因:

  1. 错误的配置:检查 forever 的启动配置文件,确保没有重复启动脚本。
  2. 多进程启动:你的应用中可能包含了多进程启动逻辑,例如通过 cluster 模块创建多个工作进程。

为了诊断问题,你可以使用 ps 命令查看具体是哪些进程:

ps aux | grep node

示例代码:防止多进程启动

假设你的 Node.js 应用程序使用了 cluster 模块,但你只想运行单个进程。你可以这样修改:

const cluster = require('cluster');
const http = require('http');

if (cluster.isMaster) {
    console.log(`Master ${process.pid} is running`);

    // Fork workers.
    cluster.fork();
    
    // 如果只想运行一个worker,那么在这里退出
    process.exit(0);
} else {
    // Workers can share any TCP connection
    // In this case it is an HTTP server
    http.createServer((req, res) => {
        res.writeHead(200);
        res.end('hello world\n');
    }).listen(8000);

    console.log(`Worker ${process.pid} started`);
}

在这个例子中,如果检测到主进程,它将仅启动一个工作进程并退出,从而防止启动额外的进程。

使用 Forever 正确启动

确保你在命令行中正确地使用了 forever 来启动应用程序。通常,只需要一次启动命令:

forever start app.js

若需要更详细的日志或控制输出,可以添加额外的选项,比如 -l, -o, -e

forever start -l forever.log -o out.log -e err.log app.js

通过这种方式,你可以更好地调试和理解 forever 如何管理你的 Node.js 应用程序进程。

回到顶部