Answers:
聚会晚了,但是节点窗口也可以解决问题。
它还内置了系统日志记录。
有一个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:我是这个模块的作者。
我发现它非常有用,以至于在它周围构建了一个更易于使用的包装器(npm,github)。
安装它:
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
WinSer是流行的NSSM(非吸吮服务管理器)周围的node.js友好包装器。
接下来,我想像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
我不是直接解决这个问题,而是提供一种可能也可以以更Node.js的方式满足您要求的替代方案。
功能上的要求是:
通过使用流程管理器(PM)并使流程管理器在系统启动时启动,可以满足这些要求。两个对Windows友好的优秀PM:
要使PM自动启动,最简单的方法是使用“启动时”触发器创建计划任务:
pm2
使用批处理脚本,请确保包含环境变量,否则它将不起作用。此处讨论: github.com/Unitech/pm2/issues/1079
我一年前发布的流程管理器+任务计划程序方法可以与某些一次性服务安装一起很好地工作。但是最近我开始以微服务方式设计系统,许多小服务通过IPC相互通信。因此,手动配置每个服务变得难以忍受。
为了实现无需手动配置即可安装服务的目标,我创建了serman,这是一个命令行工具(使用npm i -g serman
进行安装),用于将可执行文件安装为服务。您只需要编写(并且只编写一次)便是一个简单的服务配置文件以及可执行文件。跑
serman install <path_to_config_file>
将安装该服务。stdout
并stderr
全部记录下来。有关更多信息,请访问项目网站。
有效的配置文件非常简单,如下所示。但它也具有许多有用的功能,例如<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>