该库可用于安装/开始/停止/卸载节点脚本作为生产环境的Windows背景服务。这不是开发应用程序的工具,它是用于释放它们的工具。该工具会生成可执行的可执行文件,该可执行文件将在计算机上安装的任何版本的Node.js运行您的应用程序。
如果您需要支持这些操作系统,请参见Node-MAC和Node-Linux。
如果您需要我,请发推文(@goldglovecb)。
![]() | ![]() | ![]() | ![]() |
不能赞助? 考虑提名@coreybutler为GitHub明星。 | |||
节点窗口中有以下功能:
exec命令。安装节点窗口的推荐方法是使用NPM,使用全局标志:
npm install -g node-windows
然后,在您的项目root中,运行:
npm link node-windows
然而;可以使用没有全局标志的节点 - 窗口(即直接安装到项目根部)。有关为什么这不是推荐方法的更多详细信息,则可以在整个读书中获得。
在Windows上使用本机节点模块可能会很烂。大多数天然模块不是以二进制格式分布的。取而代之的是,这些模块依靠npm利用节点GYP来构建项目。这意味着开发人员需要在系统上安装Visual Studio(以及潜在的其他软件),以安装本机模块。这是可移植的,但很痛苦……主要是因为Visual Studio本身超过2GB。
节点窗口不使用本机模块。有一些二进制/EXE实用程序,但是运行更复杂的任务所需的一切都以易于使用的格式打包和分发。因此,不需要视觉工作室...至少不是这个模块。
节点窗口具有一个实用程序,可以将node.js脚本作为Windows服务运行。请注意,像所有Windows服务一样,创建一个需要管理特权。要使用节点窗口创建服务,请准备一个类似的脚本:
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' ,
nodeOptions : [
'--harmony' ,
'--max_old_space_size=4096'
]
//, workingDirectory: '...'
//, allowServiceLogon: true
} ) ;
// Listen for the "install" event, which indicates the
// process is available as a service.
svc . on ( 'install' , function ( ) {
svc . start ( ) ;
} ) ;
svc . install ( ) ;上面的代码创建了一个新的Service对象,提供了一个漂亮的名称和描述。 script属性标识了应作为服务运行的node.js脚本。运行此操作后,从Windows Services实用程序中可以看到该脚本。
Service对象发出以下事件:
在上面的示例中,脚本聆听install事件的脚本。由于完成服务安装后,该事件是触发的,因此可以安全地启动服务。
节点窗口创建的服务类似于Windows上运行的大多数其他服务。它们可以通过Windows Service实用程序,通过NET START或NET STOP命令启动/停止,甚至使用SC实用程序进行管理。
可能需要指定命令行切换到您的脚本。您可以通过在服务配置中设置scriptOptions来做到这一点:
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
script : 'C:\path\to\helloworld.js' ,
scriptOptions : '-c C:\path\to\somewhere\special -i'
} ) ;有时,您可能需要提供服务,并在创建服务时传递的静态数据。您可以通过在服务配置中设置环境变量来执行此操作,如下所示:
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
script : 'C:\path\to\helloworld.js' ,
env : {
name : "HOME" ,
value : process . env [ "USERPROFILE" ] // service is now able to access the user who created its' home directory
}
} ) ;您还可以提供一个数组来设置多个环境变量:
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
script : 'C:\path\to\helloworld.js' ,
env : [ {
name : "HOME" ,
value : process . env [ "USERPROFILE" ] // service is now able to access the user who created its' home directory
} ,
{
name : "TEMP" ,
value : path . join ( process . env [ "USERPROFILE" ] , "/temp" ) // use a temp directory in user's home directory
} ]
} ) ;有时您可能需要指定一个特定的node可执行文件以运行脚本。您可以通过在服务配置中设置execPath来做到这一点,如下所示:
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
script : 'C:\path\to\helloworld.js' ,
execPath : 'C:\path\to\specific\node.exe'
} ) ;如果您需要指定特定的用户或特定凭据来管理服务,则以下属性可能会有所帮助。
user属性是带有三个键的对象: domain , account和password 。这可以用来识别服务库应使用的用户执行系统命令。默认情况下,域设置为本地计算机名称,但是可以使用Active Directory或LDAP域覆盖它。例如:
app.js
var Service = require ( 'node-windows' ) . Service ;
// Create a new service object
var svc = new Service ( {
name : 'Hello World' ,
script : require ( 'path' ) . join ( __dirname , 'helloworld.js' ) ,
//, allowServiceLogon: true
} ) ;
svc . logOnAs . domain = 'mydomain.local' ;
svc . logOnAs . account = 'username' ;
svc . logOnAs . password = 'password' ;
...如果您希望服务模块作为特定用户运行命令,则必须明确定义帐户和密码。默认情况下,它将使用启动该过程的用户帐户(即启动node app.js )运行。
如果要指示WinSW允许服务帐户登录,请指定allowServiceLogon: true 。默认情况下,由于某些用户在没有服务登录的情况下经历了此问题,因此默认情况下是禁用的。
另一个属性是sudo 。此属性具有一个称为password的单个属性。通过提供此信息,服务模块将尝试使用启动该帐户的过程和密码的用户帐户运行命令。这仅应用于具有管理特权的帐户。
app.js
var Service = require ( 'node-windows' ) . Service ;
// Create a new service object
var svc = new Service ( {
name : 'Hello World' ,
script : require ( 'path' ) . join ( __dirname , 'helloworld.js' )
} ) ;
svc . sudo . password = 'password' ;
...该服务也可以取决于其他Windows服务。
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
script : 'C:\path\to\helloworld.js' ,
dependsOn : [ "serviceA" ]
} ) ;卸载先前创建的服务在句法上与安装相似。
var Service = require ( 'node-windows' ) . Service ;
// Create a new service object
var svc = new Service ( {
name : 'Hello World' ,
script : require ( 'path' ) . join ( __dirname , 'helloworld.js' )
} ) ;
// Listen for the "uninstall" event so we know when it's done.
svc . on ( 'uninstall' , function ( ) {
console . log ( 'Uninstall complete.' ) ;
console . log ( 'The service exists: ' , svc . exists ) ;
} ) ;
// Uninstall the service.
svc . uninstall ( ) ;卸载过程仅删除特定于过程的文件。它不会删除您的node.js脚本!
很多东西!
长期运行过程和监视:
Windows服务的内置服务恢复相当有限,并且不能轻易从代码配置。因此,节点 - 窗口会在node.js脚本周围创建一个包装器。该包装器负责以智能和可配置的方式重新启动失败的服务。例如,如果您的脚本由于未知错误而崩溃,则节点窗口将尝试重新启动它。默认情况下,每秒都会发生这种情况。然而;如果脚本具有致命的缺陷,使其反复崩溃,则将不必要的开销添加到系统中。节点 - 窗口通过增加重新启动之间的时间间隔并限制最大重新启动数来处理这一点。
更聪明的重新启动不会撞击您的服务器:
使用默认设置,Node-Windows每次重新启动脚本都需要在等待间隔中增加25%。在默认设置(1秒)的情况下,第一秒钟后进行了第一个重新启动尝试。第二次发生在1.25秒后。 1.56秒后的第三次(1.25增加了25%),依此类推。最初的等待时间和增长率都是配置选项,可以传递给新Service 。例如:
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
script : 'C:\path\to\helloworld.js' ,
wait : 2 ,
grow : .5
} ) ;在此示例中,等待期将从2秒开始,并增加50%。因此,第二次尝试将在3秒钟后,而第四秒将是4.5秒。
不要自己!
重复的回收可能会因不良脚本而永远持续下去。为了应对这些情况,节点窗口支持两种帽子。使用maxRetries将限制最大重新启动尝试。默认情况下,这是无限的。将其设置为3将告诉该过程在失败3次后不再重新启动该过程。另一个选择是maxRestarts ,它可以在60秒内限制尝试重新启动的数量。例如,如果将其设置为3(默认值),并且该过程反复崩溃/重新启动,则节点窗口将在60秒的窗口中停止在第三个周期后停止尝试。这两个配置选项都可以设置,就像wait或grow一样。
最后,如果您希望脚本在错误退出时根本不重新启动,则可以将称为abortOnError的属性设置为true 。
Node-Windows使用Winsw实用程序为每个Node.js脚本创建一个部署为服务的唯一.exe 。由myappname.exe和myappname.xml创建和填充一个称为daemon的目录。 XML文件是可执行文件的配置。此外, winsw将在此目录中为自身创建一些日志(在事件日志中可以查看)。
myappname.exe文件启动了节点 - 窗口包装器,该包装器负责监视和管理脚本。由于此文件是节点窗口的一部分,因此移动节点 - 窗口目录可能会导致.exe文件无法找到node.js脚本。然而;根据建议的安装说明,如果节点 - 窗口在全球安装,这不应该是问题。
所有这些特定于守护程序的文件都是在称为daemon的子目录中创建的,该台将其创建在保存node.js脚本的同一目录中。卸载服务将删除这些文件。
事件记录
用节点窗口创建的服务有两个事件日志,可以通过Windows事件查看器查看。名为myappname.exe的日志源为可执行文件提供了基本日志记录。它可用于查看整个服务何时开始/停止或有错误。 Node-Windows Monitor使用了第二个以您的服务名称(即我的应用程序名称)命名的日志。可以使用Node-Windows Event Loggging从Node.js脚本写入该日志。
截至v0.1.0的新事件是基于非C ++的事件记录实用程序。该实用程序可以写入事件日志,使您的日志从事件查看器中可见。它在引擎盖下使用EventCreate。
创建一个记录器:
var EventLogger = require ( 'node-windows' ) . EventLogger ;
var log = new EventLogger ( 'Hello World' ) ;
log . info ( 'Basic information.' ) ;
log . warn ( 'Watch out!' ) ;
log . error ( 'Something went wrong.' ) ;看起来与:
也可以通过Node-Windows Event Logging获得一些较少使用的选项。
log . auditSuccess ( 'AUser Login Success' ) ;
log . auditFailure ( 'AUser Login Failure' ) ;每个日志类型(信息,警告,错误,审核和审计)方法(可选)都接受两个其他参数,包括代码和回调。默认情况下,事件代码为1000 ,如果没有另行指定。为了提供带有日志消息的自定义事件代码并将该消息写入控制台,可以使用以下代码:
注意: EventCreate似乎仅支持自定义ID <= 1000。
log . info ( 'Something different happened!' , 700 , function ( ) {
console . log ( 'Something different happened!' ) ;
} ) ;默认情况下,事件日志都是APPLICATION范围的一部分。然而;也可以使用SYSTEM日志。为此,必须将配置对象传递给新日志:
var EventLogger = require ( 'node-windows' ) . EventLogger ;
var log = new EventLogger ( {
source : 'My Event Log' ,
eventLog : 'SYSTEM'
} ) ;包装器生成的警告事件日志可以通过在创建服务时禁用它来抑制它。默认情况下启用了警告日志。
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
disableWarningLogs : true ,
} ) ;节点 - 窗口带有多个命令,以简化MS Windows上的任务。
高架与Linux/Mac上的sudo相似。它试图将当前用户的特权提升到本地管理员。使用此功能不需要密码,但确实要求当前用户具有管理特权。没有这些特权,该命令将失败,而access denied错误。
在启用UAC的系统上,这可能会提示用户允许继续进行:
语法:
elevate(cmd[,options,callback])
require('child_process').exec(cmd,<OPTIONS>,callback) 。require('child_process').exec(cmd,options,<CALLBACK>) 。 Sudo的作用与Linux/Mac上的sudo相似。与Elevate不同,它需要密码,但不会提示用户许可继续进行。像Elevate一样,这仍然需要用户的管理特权,否则命令将失败。此和抬高()之间的主要区别是提示。
语法:
sudo(cmd,password[,options,callback])
require('child_process').exec(cmd,<OPTIONS>,callback) 。require('child_process').exec(cmd,options,<CALLBACK>) 。 此异步命令确定当前用户是否具有管理特权。它将布尔值传递给回调,如果用户是管理员或false ,则返回true 。
例子
var wincmd = require ( 'node-windows' ) ;
wincmd . isAdminUser ( function ( isAdmin ) {
if ( isAdmin ) {
console . log ( 'The user has administrative privileges.' ) ;
} else {
console . log ( 'NOT AN ADMIN' ) ;
}
} ) ; 列表方法查询操作系统以获取运行过程列表。
var wincmd = require ( 'node-windows' ) ;
wincmd . list ( function ( svc ) {
console . log ( svc ) ;
} , true ) ;这返回运行过程。在上面的示例中提供可选的true参数提供了一个带有详细输出的列表。输出特定于操作系统的版本。这是Windows 8计算机上详细输出的示例。
[ {
ImageName : 'cmd.exe' ,
PID : '12440' ,
SessionName : 'Console' ,
'Session#' : '1' ,
MemUsage : '1,736 K' ,
Status : 'Unknown' ,
UserName : 'Machine\Corey' ,
CPUTime : '0:00:00' ,
WindowTitle : 'N/A'
} , {
ImageName : 'tasklist.exe' ,
PID : '1652' ,
SessionName : 'Console' ,
'Session#' : '1' ,
MemUsage : '8,456 K' ,
Status : 'Unknown' ,
UserName : 'Machine\Corey' ,
CPUTime : '0:00:00' ,
WindowTitle : 'N/A'
} ]常规(非verbose)输出通常提供ImageName , PID , SessionName , Session# , MemUsage和CPUTime 。
此方法将通过PID杀死一个过程。
var wincmd = require ( 'node-windows' ) ;
wincmd . kill ( 12345 , function ( ) {
console . log ( 'Process Killed' ) ;
} ) ;在此示例中,过程ID 12345将被杀死。重要的是要注意,执行此节点脚本的用户帐户可能需要管理特权。
如果您在示例中遇到问题,请查看TESTS.md文件。
如果您遇到了无效的安装事件,请查看在安装过程中创建的daemon程序目录,以确保在那里.exe和.xml文件。在某些情况下,主要是在_un_installation期间,该过程暂时锁定日志文件是可能的,从而防止窗口删除它。在这种情况下,只需再次运行卸载即可。在大多数情况下,这将解决该问题。如果不是,请在再次运行安装之前手动卸下daemon程序目录。
有许多贡献者已经做了从攻读功能到帮助我陷入困境的懈怠的所有工作。我的帮助非常感谢。
特别感谢@arthurblake的修改终于添加了。多亏了 @Hockeytim11,他帮助编译和更新了许多出色的问题,并开始为其他节点 - *库提供支持。
Winsw和Sudowin是各自所有者的版权。 WINSW是根据MIT许可证分发的。 Sudowin是根据BSD许可证分发的。
所有其他脚本均为版权(C)Corey Butler在MIT许可下。
(麻省理工学院许可证)
版权(C)2013 Corey Butler
特此免费授予任何获得此软件副本和相关文档文件副本(“软件”)的人,以无限制处理该软件,包括不限于使用,复制,修改,合并,合并,发布,分发,分发,分发,撒下,sublicense和/或允许软件的副本,并允许对以下条件提供以下条件,以下是以下条件。
上述版权通知和此许可通知应包含在软件的所有副本或大量部分中。
该软件是“按原样”提供的,没有任何形式的明示或暗示保证,包括但不限于适销性,适合特定目的和非侵害的保证。在任何情况下,作者或版权持有人都不应对任何索赔,损害赔偿或其他责任责任,无论是在合同,侵权的诉讼中还是其他责任,是由软件,使用或与软件中的使用或其他交易有关的。