【问题标题】:Auto start node.js server on boot启动时自动启动 node.js 服务器
【发布时间】:2013-12-25 02:02:43
【问题描述】:

任何 node.js 专家可以告诉我如何配置 node JS 以在我的机器启动时自动启动服务器吗? 我在 Windows 上

【问题讨论】:

  • *.com/questions/20426652/…这和你上次问的有什么不同?
  • 1) 您的最后一个问题是针对 Winblows,答案会因平台而异; 2) 如果在 Linux 上,最简单的方法可能是使用发行版的进程管理器(sysvinit、upstart、systemd)
  • 不幸的是在 Winblows 上,经过编辑以反映这一点
  • 他对最后一个问题的唯一答案不满意,所以他重新提出了一个悬赏。
  • Winblows?这是 1999 年的 Slashdot 吗?

标签: node.js


【解决方案1】:

这根本不需要在 node.js 中配置,这完全是操作系统的责任(在你的情况下是 Windows)。实现此目的最可靠的方法是通过 Windows 服务。

有一个超级简单的模块,可以将节点脚本安装为Windows服务,它被称为node-windowsnpmgithubdocumentation) .我以前用过,效果很好。

var Service = require('node-windows').Service;

// Create a new service object
var svc = new Service({
  name:'Hello World',
  description: 'The nodejs.org example web server.',
  script: 'C:\\path\\to\\helloworld.js'
});

// Listen for the "install" event, which indicates the
// process is available as a service.
svc.on('install',function(){
  svc.start();
});

svc.install();

附言

我发现这个东西非常有用,因此我围绕它构建了一个更易于使用的包装器(npmgithub)。

安装它:

npm install -g qckwinsvc

安装您的服务:

> qckwinsvc
prompt: Service name: [name for your service]
prompt: Service description: [description for it]
prompt: Node script path: [path of your node script]
Service installed

卸载您的服务:

> qckwinsvc --uninstall
prompt: Service name: [name of your service]
prompt: Node script path: [path of your node script]
Service stopped
Service uninstalled

【讨论】:

  • "qckwinsvc" 太棒了。感谢您的提示。
  • 嗯,如何在没有提示的情况下调试我的应用程序?我知道节点检查器可能会有所帮助,但使用 CMD 进行调试似乎更直观。
  • 我尝试将 node express 应用程序安装为服务,并且它正在运行(我从 *.out.log 文件中的 console.log 调用中获取输出),但是当我尝试获取通过我的网络浏览器从服务器响应,我只得到一个 404 回复。
  • 使用 qckwinsvc 我收到了我的服务已安装并启动的消息,但使用 services.msc 我看不到它们。此外,我的服务在启动时写入日志,但未创建日志。
  • 如果可以的话,我会给这 10 个赞。我已经断断续续地与 pm2 抗争了好几个星期,试图让它在 Windows 上运行。我尝试了这个并在 10 分钟内运行了一项服务。谢谢!
【解决方案2】:

如果您使用 Linux、macOS 或 Windows,pm2 是您的朋友。它是一个处理集群的进程管理器。

你安装它:

npm install -g pm2

启动一个集群,例如 3 个进程:

 pm2 start app.js -i 3

并让 pm2 在启动时启动它们:

 pm2 startup

它有一个 API,甚至还有一个 monitor interface:

转到 github 并阅读 instructions。它易于使用且非常方便。自 forever 以来最好的事情。

【讨论】:

  • 不幸的是在 Windows 8 上
  • 先生,这个答案值得更多的支持。谢谢。另外我想说pm2 startup需要这个平台参数之一:<ubuntu|centos|gentoo|systemd>,即:
  • @Deerloper 参数不是必需的。从他们的官方页面:$ pm2 startup # auto-detect platform$ pm2 startup [platform] # render startup-script for a specific platform, the [platform] could be one of: # ubuntu|centos|redhat|gentoo|systemd|darwin|amazon
  • 这太棒了,值得成为最佳答案并获得更多赞成票。谢谢!
  • @baptx 如果您对 systemd UX 感到满意,那么 pm2 的主要吸引力在于它更便携:基于非 systemd 的发行版、macOS 和 Windows。
【解决方案3】:

如果我没记错的话,您可以使用命令行启动您的应用程序,因此也可以使用批处理文件。在这种情况下,使用 Windows 登录启动它并不是一项非常困难的任务。

您只需创建一个包含以下内容的批处理文件:

node C:\myapp.js

并使用 .bat 扩展名保存它。这里 myapp.js 是您的应用程序,在本例中位于 C: 驱动器(指定路径)。

现在您可以将批处理文件放入位于 C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 的启动文件夹中

只需在运行对话框中使用 %appdata% 打开它,然后找到 >Roaming>Microsoft>Windows>Start Menu>Programs>Startup

批处理文件将在登录时执行并从 cmd 启动您的节点应用程序。

【讨论】:

  • 这行得通,但这是穷人的方式。下面的回答更好。将其安装为服务。
  • @MindJuice 我同意,虽然这只是一个简单的方法,所以我认为值得一提。
  • 我的应用程序需要同时在 Linux 和 Windows 上运行,所以这个解决方案对我来说效果更好,因为它不需要我在我的应用程序中需要特定于 Windows 的包。解决方案简单并不意味着它是一个糟糕的解决方案。
  • 其实只有登陆机器才有效。但是,对于扩展/CI 目的(生产环境),这是行不通的。
【解决方案4】:

这可以通过 Windows 任务计划程序轻松手动完成。

  • 首先,安装forever
  • 然后,创建一个包含以下内容的批处理文件:

    cd C:\path\to\project\root
    call C:\Users\Username\AppData\Roaming\npm\forever.cmd start server.js
    exit 0
    
  • 最后,创建一个在您登录时运行的计划任务。此任务应调用批处理文件。

【讨论】:

    【解决方案5】:

    我建议将您的 node.js 应用程序安装为 Windows 服务,然后将该服务设置为在启动时运行。通过使用 Windows 服务管理单元,而不是必须在启动文件夹中添加或删除批处理文件,应该可以更轻松地控制启动操作。

    * 中的另一个与服务相关的问题提供了几个(显然)非常好的选择。查看How to install node.js as a Windows Servicenode-windows 看起来对我很有希望。顺便说一句,我对需要作为服务运行的 Java 应用程序使用了类似的工具。它让我的生活变得轻松多了。希望这会有所帮助。

    【讨论】:

      【解决方案6】:

      你应该试试这个

      npm 永远

      https://www.npmjs.com/package/forever

      【讨论】:

        【解决方案7】:

        使用pm2 在 Windows 上启动和运行您的 nodejs 进程。

        请务必阅读这个关于如何设置任务调度程序以启动 pm2 的 github 讨论:https://github.com/Unitech/pm2/issues/1079

        【讨论】:

          【解决方案8】:

          Here is another solution我用C#写的,在Windows上自动启动本地节点服务器或pm2服务器。

          【讨论】:

            【解决方案9】:

            我知道根据上面共享的解决方案,有多种方法可以实现这一目标。我还没有尝试过所有这些,但是一些第三方服务对在后台运行的所有任务缺乏明确性。我通过一个类似于 Windows 批处理文件中提到的 powershell 脚本实现了这一点。我已经使用 Windows 任务计划程序安排它每分钟运行一次。到目前为止,这一直非常有效和透明。我在这里的优势是我在重新开始之前明确地检查了这个过程。这不会对服务器上的 CPU 造成太多开销。此外,您不必将文件显式放入启动文件夹中。

            function CheckNodeService ()
            {
            
            $node = Get-Process node -ErrorAction SilentlyContinue
            
            if($node)
            {
                echo 'Node Running'
            }
            else
            {
                echo 'Node not Running'
                Start-Process "C:\Program Files\nodejs\node.exe" -ArgumentList "app.js" -WorkingDirectory "E:\MyApplication"
                echo 'Node started'
            
            }
            }
            
            CheckNodeService
            

            【讨论】:

              【解决方案10】:

              只需使用它,安装、运行并保存当前进程列表

              https://www.npmjs.com/package/pm2-windows-startup

              根据我的经验,重启服务器后,需要登录,才能触发自动启动。

              【讨论】:

                【解决方案11】:

                直接从this answer复制:

                你可以用任何你想自动化的语言编写脚本(甚至使用 nodejs),然后在用户的 %appdata%\Microsoft\Windows\Start Menu\Programs\Startup 文件夹中安装该脚本的快捷方式

                【讨论】:

                • 在这种情况下,将问题标记为重复,而不是在此处复制/粘贴答案。