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

时间:2011-02-04 22:28:42

标签: node.js

在Python Twisted中,你有twistd命令可以帮助你完成许多与运行你的应用程序有关的事情(例如守护它)。

如何守护 node.js 服务器,以便即使在当前会话关闭后它也可以运行?

感谢您的帮助

8 个答案:

答案 0 :(得分:85)

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();

答案 1 :(得分:41)

如果你需要你的进程来守护自己,而不是永远地继续 - 你可以使用 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]");
}

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

答案 2 :(得分:17)

更新:我已更新为包含pm2的最新内容:

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

https://github.com/unitech/pm2

http://pm2.io

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

答案 3 :(得分:13)

要使用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

请记住,每次更改.service文件后都要更新systemd守护程序

$ systemctl daemon-reload

然后启动服务,并启用服务以重启

启动
$ systemctl start myservice
$ systemctl enable myservice

答案 4 :(得分:12)

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

$ node server.js &

然后您可以在以后杀死该进程。我通常会做以下事情:

$ killall node

注意:我正在运行OS X.

答案 5 :(得分:6)

您可以尝试:

$ nohup node server.js &

它适用于Mac和Linux。

输出将在./nohup.out文件

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

答案 6 :(得分:2)

还有更高级的通用跑步者,例如monitrunit

答案 7 :(得分:0)

有关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

如果您想要便携式(跨平台),其他帖子提供的解决方案可能就足够了。