如何将node.js安装为Windows服务?


130

我已经下载了node.js可执行文件。如何将可执行文件作为Windows服务运行?我无法使用标准的node.js安装程序,因为我需要同时运行多个版本的node.js。

Answers:


187

聚会晚了,但是节点窗口也可以解决问题。

在此处输入图片说明

它还内置了系统日志记录。

在此处输入图片说明

有一个API可通过代码创建脚本,即

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

FD:我是这个模块的作者。


3
第二个“很棒”。我只是按照您的自述说明进行操作,它开箱即用-非常罕见!您可能需要添加到自述文件中的一件事:如何在CLI上运行创建的js脚本:即>节点set_up_win_service.js ...
mike rodent

@Corey我可以使用此模块将JXCore包作为服务运行吗?
Madhur

@Madhur-从理论上讲,它可能会起作用,但是我没有也不打算进行测试。节点窗口使用负责监视/重新启动的wrapper.js文件。但是,这只是将节点脚本作为子进程启动。也可以配置可执行路径(即用jx代替node)。因此,从理论上讲,您可能会这样做,但是我不知道您可能会遇到哪种怪癖。
科里2014年

@Corey我有一个简单的Http Node应用程序,但使用该服务似乎无法保持运行。它可以安装并正常启动,但会立即停止。先生,任何帮助将不胜感激!事件查看器未显示任何错误,但显示警告:子进程[50732-C:\ Program Files \ nodejs \ node.exe --harmony“ C:\ Users \ bmechkov \ AppData \ Roaming \ npm \ node_modules \ node-windows \ lib \ wrapper.js“ -f” C:\ dev \ Node \ abs_tips \ server.js“ -l” NODE ABS TIPS“ -g 0.25 -w 1 -r 3 -an]以0结尾
Mechkov

@Mechkov-以0终止表示成功退出。如果没有节点窗口,是否可以成功运行脚本?
科里

40

我发现它非常有用,以至于在它周围构建了一个更易于使用的包装器(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-卸载

prompt: Service name: [name of your service]
prompt: Node script path: [path of your node script]
Service stopped
Service uninstalled

谢谢,非常简单!!quarky,它对我有用(赢得10 64位)
Furkan

“ npm ERR!asyncWrite不是函数”“ npm ERR!pna.nextTick不是函数”
Timwi

谢谢,这很容易使用。
Enrique Flores

27

WinSer是流行的NSSM(非吸吮服务管理器)周围的node.js友好包装器。


不喜欢NSSM,因为它假定它是Non-Sucking,因为它可以处理托管应用程序崩溃,因此实际上是托管应用程序在吸吮。总的来说,不要仅仅因为是微软而指责微软。
Felice Pollano

2
@FelicePollano NSSM认为它是“不吮吸”的,因为它监视托管的应用程序,这与其他解决方案(如srvany)使服务处于运行状态(即使被包装的进程终止)相反。
尔根·斯坦伯

@JürgenSteinblock,这正是我说的:托管应用程序很
糟糕

2
@FelicePollano托管应用程序退出并不表示错误。关键是:NSSM反映了(或可以反映出是否配置正确)真实的服务状态,因此可以监视服务,而不仅仅是像其他服务管理器那样假设运行状态(作为用户,我想杀死托管进程,而从属进程仍会显示服务处于运行状态)。
尔根·斯坦伯

16

从这个博客

接下来,我想像IIS一样将节点作为服务托管。这样,它就可以在我的机器上启动,在后台运行,在崩溃时自动重新启动等等。

这是nssm(不吸引服务的经理)输入图片的地方。使用此工具,您可以将普通的.exe托管为Windows服务。

这是我用来将节点应用程序的实例设置为服务,像管理员一样打开cmd并键入以下命令的命令:

nssm.exe install service_name c:\your_nodejs_directory\node.exe c:\your_application_directory\server.js
net start service_name

14

我不是直接解决这个问题,而是提供一种可能也可以以更Node.js的方式满足您要求的替代方案。

功能上的要求是:

  1. 使逻辑(应用程序)在后台运行
  2. 能够启动/停止逻辑
  3. 系统启动时自动启动逻辑

通过使用流程管理器(PM)并使流程管理器在系统启动时启动,可以满足这些要求。两个对Windows友好的优秀PM:

要使PM自动启动,最简单的方法是使用“启动时”触发器创建计划任务:

在此处输入图片说明


如果尝试在启动时开始pm2使用批处理脚本,请确保包含环境变量,否则它将不起作用。此处讨论: github.com/Unitech/pm2/issues/1079
powerpowered

@steampowered如何给PM2_Home路径?
charan tej

0

我一年前发布的流程管理器+任务计划程序方法可以与某些一次性服务安装一起很好地工作。但是最近我开始以微服务方式设计系统,许多小服务通过IPC相互通信。因此,手动配置每个服务变得难以忍受。

为了实现无需手动配置即可安装服务的目标,我创建了serman,这是一个命令行工具(使用npm i -g serman进行安装),用于将可执行文件安装为服务。您只需要编写(并且只编写一次)便是一个简单的服务配置文件以及可执行文件。跑

serman install <path_to_config_file>

将安装该服务。stdoutstderr全部记录下来。有关更多信息,请访问项目网站

有效的配置文件非常简单,如下所示。但它也具有许多有用的功能,例如<env><persistent_env>以下。

<service>
  <id>hello</id>
  <name>hello</name>
  <description>This service runs the hello application</description>

  <executable>node.exe</executable>

  <!-- 
       {{dir}} will be expanded to the containing directory of your 
       config file, which is normally where your executable locates 
   -->
  <arguments>"{{dir}}\hello.js"</arguments>

  <logmode>rotate</logmode>

  <!-- OPTIONAL FEATURE:
       NODE_ENV=production will be an environment variable 
       available to your application, but not visible outside 
       of your application
   -->
  <env name="NODE_ENV" value="production"/>

  <!-- OPTIONAL FEATURE:
       FOO_SERVICE_PORT=8989 will be persisted as an environment
       variable machine-wide.
   -->
  <persistent_env name="FOO_SERVICE_PORT" value="8989" />
</service>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.