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

如何启动node.js服务器作为守护进程?,node.js,Node.js,在PythonTwisted中,您有twistd命令,该命令可以帮助您完成与运行应用程序相关的许多事情(例如,将其daemonize) 如何对node.js进行后台监控,使其在当前会话关闭后仍能运行?是您问题的答案 安装 用法 从命令行永远使用 $ forever start server.js 使用Node.js的永久实例 var forever = require('forever'); var child = new forever.Forever('your-filename.j

在PythonTwisted中,您有
twistd
命令,该命令可以帮助您完成与运行应用程序相关的许多事情(例如,将其daemonize)

如何对node.js进行后台监控,使其在当前会话关闭后仍能运行?

是您问题的答案

安装 用法 从命令行永远使用

$ forever start server.js
使用Node.js的永久实例

var forever = require('forever');

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

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

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

$ node server.js &
然后,您可以稍后终止该进程。我通常会这样做:

$ killall node

注意:我正在运行OS X。

还有更高级的通用运行程序,如
monit
runit
如果您需要进程对自身进行后台监控,而不是永远依赖,则可以使用后台监控模块

$ 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]");
}

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

更新:我更新了pm2的最新版本:

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

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

对于POSIX系统上后台守护程序的正常方式,您可以搜索C方法

我在node.js API中还没有看到足够的方法来允许手工用C方式完成。但是,在使用child_进程时,您可以让node.js为您执行以下操作:

我认为这是一个潜在的浪费时间,因为有一个很好的机会,你的系统提供相同的。 例如:

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

您可以尝试:

$ nohup node server.js &
它在Mac和Linux上对我有效

输出将在
/nohup.out
文件中


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

要启动
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文件后更新service manager守护程序

$ systemctl daemon-reload
然后启动正在运行的服务,并启用服务在引导时启动

$ systemctl start myservice
$ systemctl enable myservice

请注意,如果退出终端/ssh会话,这将不起作用。完整的解决方案是nohup node server.js>/dev/null 2>&1&@michaeldellon为什么您认为将输出重定向到
/dev/null
应该包含在完整的解决方案中?应该使用-g选项进行全局安装。可能需要权限才能执行此操作。重新启动时会发生什么情况?@AlexBrown-如果您想让它在重新启动后继续运行,您需要将
永久启动服务器.js
添加到启动脚本(例如
rc.local
)中。我最终决定使用monit启动和停止永久启动进程。永久已死,pm2是新国王。请不要把你的时间浪费在永远上。我刚换了衣服,被风吹走了。pm2可以通过一个简单的。。pm2启动app.js-i 0——名称“myapp”。。。哇!尝试一下,你不会永远回头。。。参见@Gary Bernitz Answer你在app.js中放了什么?对我来说,它只是立即退出。重新启动时会发生什么?
case'restart':daemon.on('stopped',()=>{daemon.start();});daemon.stop();中断看也永远死了,pm2是王者!从那以后,我一直在使用pm2,但我刚刚切换到pm2。哇!哇!哇!永远在1个内核上运行你的应用程序,pm2也可以这样做,或者它可以在所有可用内核上平衡你的应用程序的负载。哇!不需要@reboot cron作业,只需启动pm2(将pm2作为systemd或OS等效服务启动),然后保存pm2即可。现在重新启动,您的应用程序仍在运行。您可以通过pm2 show获取正在运行的应用程序的状态。手表很容易买到。哇!难以置信的哇!在openshift中为非root用户设置pm2太麻烦了。在这种情况下,您将server.js的附加参数放在哪里?
$ systemctl start myservice
$ systemctl enable myservice