このライブラリは、制作環境向けのWindowsバックグラウンドサービスとしてノードスクリプトをインストール/開始/停止/アンインストールするために使用できます。これは、アプリケーションを開発するためのツールではなく、リリースするためのツールです。このツールは、node.jsのどのバージョンでもコンピューターにインストールされている場合でもアプリを実行する実行可能ファイルを生成します。
これらのオペレーティングシステムをサポートする必要がある場合は、Node-MacおよびNode-Linuxを参照してください。
あなたが私を必要とするなら、私(@goldglovecb)をツイートしてください。
![]() | ![]() | ![]() | ![]() |
スポンサーができませんか? GitHubスターに@CoreyButlerを指名することを検討してください。 | |||
次の機能は、ノードウィンドウで利用できます。
execコマンドを実行します。ノードウィンドウをインストールする推奨方法は、グローバルフラグを使用してnpmを使用することです。
npm install -g node-windows
次に、プロジェクトルートで、実行してください。
npm link node-windows
しかし;グローバルフラグなしでノードウィンドウを使用することができます(つまり、プロジェクトルートに直接インストールします)。これが推奨されるアプローチではない理由に関する詳細は、このREADME全体で利用できます。
Windowsでネイティブノードモジュールを使用すると、吸うことができます。ほとんどのネイティブモジュールは、バイナリ形式で配布されていません。代わりに、これらのモジュールはnpmに依存してプロジェクトを構築し、Node-GYPを利用しています。これは、開発者がネイティブモジュールをインストールするために、システムにVisual Studio(および潜在的に他のソフトウェア)をインストールする必要があることを意味します。これはポータブルですが、痛みを伴います...主にVisual Studio自体が2GBを超えているためです。
ノードウィンドウは、ネイティブモジュールを使用しません。いくつかのバイナリ/exeユーティリティがありますが、より複雑なタスクを実行するために必要なすべてがパッケージ化され、すぐに使用可能な形式で配布されます。したがって、ビジュアルスタジオは必要ありません...少なくともこのモジュールではありません。
Node-Windowsには、Windowsサービスとしてnode.jsスクリプトを実行するユーティリティがあります。すべてのWindowsサービスと同様に、1つを作成するには管理特権が必要であることに注意してください。ノードウィンドウでサービスを作成するには、次のようなスクリプトを準備します。
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サービスユーティリティから表示されます。
Serviceオブジェクトは次のイベントを発します。
上記の例では、スクリプトはinstallイベントの耳を傾けます。このイベントは、サービスのインストールが完了したときに解雇されるため、サービスを開始するのは安全です。
ノードウィンドウによって作成されたサービスは、Windowsで実行されている他のほとんどのサービスに似ています。 Windowsサービスユーティリティから開始/停止すること、 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の3つのキーを持つオブジェクトです。これを使用して、サービスライブラリがシステムコマンドを実行するために使用するユーザーを識別することができます。デフォルトでは、ドメインはローカルコンピューター名に設定されていますが、アクティブなディレクトリまたは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を指定します。一部のユーザーは、サービスログオンなしでこれを実行している問題を経験しているため、これはデフォルトで無効になっています。
もう1つの属性は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スクリプトの周りにラッパーを作成します。このラッパーは、失敗したサービスをインテリジェントで構成可能な方法で再起動する責任があります。たとえば、不明なエラーのためにスクリプトがクラッシュした場合、ノードウィンドウは再起動しようとします。デフォルトでは、これは毎秒発生します。しかし;スクリプトに繰り返しクラッシュする致命的な欠陥がある場合、システムに不必要なオーバーヘッドが追加されます。ノードウィンドウは、再起動の間の時間間隔を増やし、再起動の最大数をキャッピングすることにより、これを処理します。
よりスマートな再起動しないサーバーを叩かない:
デフォルトの設定を使用して、ノードウィンドウは、スクリプトを再起動する必要があるたびに、待機間隔に25%を追加します。デフォルト設定(1秒)で、最初の再起動試行は1秒後に発生します。 2番目は1.25秒後に発生します。 1.56秒後の3番目(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%増加します。したがって、2番目の試行は3秒後になり、4番目は4.5秒後になります。
自分でドスしないでください!
繰り返しのリサイクルは、悪いスクリプトで永遠に続く可能性があります。これらの状況を処理するために、ノードウィンドウは2種類のキャップをサポートします。 maxRetriesを使用すると、最大数の再起動試行がキャップされます。デフォルトでは、これは無制限です。 3に設定すると、プロセスが3回故障した後、プロセスを再起動しないようになります。別のオプションはmaxRestartsです。これは、60秒以内に試行された再起動の数を制限します。たとえば、これが3(デフォルト)に設定され、プロセスが繰り返しクラッシュ/再起動する場合、ノードウィンドウは60秒のウィンドウで3回のサイクルの後に再起動の試みを停止します。これらの構成オプションは両方とも、 waitやgrowのように設定できます。
最後に、スクリプトがエラーで終了したときにまったく再起動しないようにする場合、 abortOnErrorと呼ばれる属性をtrueに設定できます。
Node-Windowsは、WinsWユーティリティを使用して、各node.jsスクリプトのユニークな.exeサービスとして展開します。 daemonと呼ばれるディレクトリが作成され、 myappname.exeおよびmyappname.xmlが入力されます。 XMLファイルは、実行可能ファイルの構成です。さらに、 winswこのディレクトリ(イベントログで表示可能)でそれ自体のログを作成します。
myappname.exeファイルは、スクリプトの監視と管理を担当するノードウィンドウラッパーを起動します。このファイルはノードウィンドウの一部であるため、ノードウィンドウディレクトリを移動すると、 .exeファイルがnode.jsスクリプトを見つけることができなくなる可能性があります。しかし;推奨されるインストール手順に従って、ノードウィンドウがグローバルにインストールされている場合、これは問題になりません。
これらのデーモン固有のファイルはすべて、 daemonと呼ばれるサブディレクトリで作成されます。これは、node.jsスクリプトが保存されているのと同じディレクトリに作成されます。サービスをアンインストールすると、これらのファイルが削除されます。
イベントロギング
ノードウィンドウで作成されたサービスには、Windowsイベントビューアーを介して表示できる2つのイベントログがあります。 myappname.exeという名前のログソースは、実行可能ファイルの基本ロギングを提供します。サービス全体がいつ開始/停止したり、エラーがあるかを確認するために使用できます。サービス名(つまり、アプリ名)にちなんで名付けられた2番目のログは、ノードウィンドウモニターで使用されます。 Node-Windowsイベントロギングを使用して、node.jsスクリプトからこのログに書き込むことができます。
v0.1.0の時点では、非C ++ベースのイベントロギングユーティリティです。このユーティリティは、イベントログに書き込み、イベントビューアーからログを表示できます。ボンネットの下でイベントクリアトを使用します。
ロガーを作成するには:
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.' ) ;似ているように見えます:
使用されていないオプションは、ノードウィンドウイベントロギングを通じても利用できます。
log . auditSuccess ( 'AUser Login Success' ) ;
log . auditFailure ( 'AUser Login Failure' ) ;各ログタイプ(情報、WARN、エラー、監査、および監査ファール)メソッドは、オプションでコードとコールバックを含む2つの追加の引数をオプションに受け入れます。デフォルトでは、特に指定されていない場合、イベントコードは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 ,
} ) ;Node-Windowsは、MS Windowsのタスクを簡素化するためのいくつかのコマンドを備えています。
Elevateは、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と同様に、これにはユーザーに管理特権が必要です。そうしないと、コマンドが失敗します。これと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ファイルを確認してください。
InvalidInstallationイベントに遭遇した場合は、インストール中に作成されたdaemon Directoryを見て、 .exeおよび.xmlファイルがあることを確認してください。状況によっては、主に_UN_INSTALLATION中に、プロセスがログファイルを一時的にロックすることができ、Windowsが削除されないようになります。このシナリオでは、アンインストールをもう一度実行するだけです。ほとんどの場合、これは問題を修正します。そうでない場合は、インストールを再度実行する前に、 daemonディレクトリを手動で削除します。
機能をコミットすることから、私が圧倒されている間にSlackを拾うのを手伝うことまで、すべてを行った多くの貢献者がいました。私は助けに非常に感謝しています。
最終的に変更が追加された@Arthurblakeに感謝します。 @hockeytim11に感謝します。 @Hockeytim11は、多くの未解決の問題のコンパイルと更新を手伝い、他のノード*ライブラリにサポートを提供し始めました。
WinswとSudowinは、それぞれの所有者の著作権です。 WINSWはMITライセンスの下で配布されています。 SudowinはBSDライセンスの下で配布されます。
他のすべてのスクリプトは、MITライセンスの下にあるCorey Butlerです。
(MITライセンス)
Copyright(c)2013 Corey Butler
このソフトウェアと関連するドキュメントファイル(「ソフトウェア」)のコピーを入手する人に、これにより許可が無料で許可されます。
上記の著作権通知とこの許可通知は、ソフトウェアのすべてのコピーまたはかなりの部分に含まれるものとします。
このソフトウェアは、商品性、特定の目的への適合性、および非侵害の保証を含むがこれらに限定されない、明示的または黙示的ないかなる種類の保証なしに「現状のまま」提供されます。いかなる場合でも、著者または著作権所有者は、契約、不法行為、またはその他の訴訟、ソフトウェアまたはソフトウェアの使用またはその他の取引に関連する、またはその他の契約、またはその他の請求、またはその他の責任について責任を負いません。