如何将 node.js 服务器作为守护进程启动?

Posted

技术标签:

【中文标题】如何将 node.js 服务器作为守护进程启动?【英文标题】:How does one start a node.js server as a daemon process? 【发布时间】:2011-06-21 16:10:15 【问题描述】:

在 Python Twisted 中,您可以使用 twistd 命令帮助您处理与运行应用程序相关的许多事情(例如,对其进行守护)。

您如何守护 node.js 服务器,使其即使在当前会话关闭后也能运行?

【问题讨论】:

另见***.com/questions/4018154/… 【参考方案1】:

Forever 是对您问题的回答。

安装

$ curl https://npmjs.org/install.sh | sh
$ npm install forever
# Or to install as a terminal command everywhere:
$ npm install -g forever

用法

从命令行使用 Forever

$ forever start server.js

使用 Node.js 中的 Forever 实例

var forever = require('forever');

  var child = new forever.Forever('your-filename.js', 
    max: 3,
    silent: true,
    args: []
  );

  child.on('exit', this.callback);
  child.start();

【讨论】:

应该使用 -g 选项全局安装。可能需要权限才能这样做。 重启后会发生什么? @AlexBrown - 如果您希望它在重新启动后仍然存在,您需要将 forever start server.js 添加到启动脚本(例如 rc.local)。 我最终决定使用 monit 来启动和停止永久进程。 forever 已死,pm2 是新王。请不要永远浪费你的时间。我刚刚换了,我被吹走了。 pm2 可以通过一个简单的.. pm2 start app.js -i 0 --name "myapp" ... WOW ... 尝试一下,您将永远不会回头... 看@加里·伯尼茨回答【参考方案2】:

如果您需要您的进程自行守护进程,而不是永远中继 - 您可以使用 daemonize 模块。

$ npm install daemonize2

然后像示例一样编写您的服务器文件:

var daemon = require("daemonize2").setup(
    main: "app.js",
    name: "sampleapp",
    pidfile: "sampleapp.pid"
);

switch (process.argv[2]) 

    case "start":
        daemon.start();
        break;

    case "stop":
        daemon.stop();
        break;

    default:
        console.log("Usage: [start|stop]");

请注意,这是一种相当低级的方法。

【讨论】:

你在 app.js 里放了什么?它会立即为我退出。 重启后会发生什么? case 'restart': daemon.on('stopped', () => daemon.start(); ); daemon.stop(); break;【参考方案3】:

要启动systemd 服务管理器守护程序,请编写服务文件。例如,创建一个文件/etc/systemd/system/myservice.service

[Unit]
Description=myservice-description
After=network.target

[Service]
ExecStart=/opt/myservice-location/src/node/server.js --args=here
Restart=always
User=me
Group=group
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/opt/myservice-location

[Install]
WantedBy=multi-user.target

记得在每次更改 myservice.service 文件后更新服务管理器守护进程。

$ systemctl daemon-reload

然后启动服务运行,使服务在开机时启动。

$ systemctl start myservice
$ systemctl enable myservice

【讨论】:

在这种情况下,您将 server.js 的附加参数放在哪里?【参考方案4】:

更新:我已更新以包含来自 pm2 的最新内容:

对于许多用例,使用 systemd 服务是管理节点进程的最简单和最合适的方式。对于那些在单一环境中运行大量节点进程或独立运行节点微服务的人来说,pm2 是一个功能更全的工具。

https://github.com/unitech/pm2

http://pm2.io

它有一个非常有用的监控功能 -> 漂亮的 'gui' 用于使用pm2 monit 或使用pm2 list 对多个进程进行命令行监控 有组织的日志管理 -> pm2 logs 其他内容:
行为配置 源地图支持 PaaS 兼容 观看并重新加载 模块系统 最大内存重新加载 集群模式 热重载 开发工作流程 启动脚本 自动完成 部署工作流 关键指标监控 API

【讨论】:

永远死了,pm2才是王道!我从永远以来一直在使用,但只是切换到 pm2。哇!哇!哇!永远在 1 个内核上运行您的应用程序,pm2 可以执行相同的操作,或者它可以在所有可用内核上对您的应用程序进行负载平衡。哇!不需要@reboot cron 作业,只需执行 pm2 启动(将 pm2 作为 systemd 或 OS 等效服务启动),然后 pm2 保存。现在重新启动,您的应用程序仍在运行。您可以使用 pm2 show 获取正在运行的应用程序的状态。手表是现成的。哇!令人难以置信的哇! 在 openshift 中为非 root 用户设置 pm2 太痛苦了。【参考方案5】:

最简单的方法就是将命令发送到后台。

$ node server.js &

然后您可以稍后终止该进程。我通常会这样做:

$ killall node

注意:我运行的是 OS X。

【讨论】:

请注意,如果您退出终端/ssh 会话,这将不起作用。完整的解决方案是 nohup node server.js >/dev/null 2>&1 & @MichaelDillon 为什么你认为将输出重定向到/dev/null 应该包含在完整的解决方案中?【参考方案6】:

你可以试试:

$ nohup node server.js &

它适用于 Mac 和 Linux。

输出将在./nohup.out 文件中

但我仍然建议你使用pm2forever,因为它们很容易用于重新启动、停止和记录。

【讨论】:

【参考方案7】:

还有更高级的通用运行器,如monitrunit

【讨论】:

【参考方案8】:

有关在 POSIX 系统上守护进程的常规方法的背景,您可以搜索 C 方法。

我在 node.js API 中没有看到足够多的方法来允许它以 C 方式手动完成。但是,当使用 child_process 时,您可以让 node.js 为您完成:

http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

我认为这可能是浪费时间,因为您的系统很有可能提供相同的功能。

例如:

http://libslack.org/daemon/manpages/daemon.1.html

如果您想要一些可移植(跨平台)的东西,其他帖子提供的解决方案可能就足够了。

【讨论】:

以上是关于如何将 node.js 服务器作为守护进程启动?的主要内容,如果未能解决你的问题,请参考以下文章

node.js项目通过pm2以守护进程方式运行

NodeJS Node-apn 实现作为守护进程

如何将 Node.js 作为后台进程运行并且永不死亡?

如何将 node.js 应用程序作为后台服务运行?

如何在启动时启动 Docker 守护进程(Windows 服务)而无需登录?

基于 Spring Boot (Tomcat) 的应用程序作为守护进程 - 如何停止?