4

現在、NodeJs Web サービスを使用して、いくつかの casper.js スクリプトをオンデマンドで実行しています。casper.js はノードへの通信チャネルとして stdout を使用し、ノードは子プロセスとして casper を実行するため、他のノード サービスのように nssm を使用してノードを Windows サービスとして実行できないため、サーバーの起動時にスケジュールされたタスク。

これは機能しますが、このコードを製品化する必要があり、実際にはクラッシュに対する回復力を高める必要があります。つまり、失敗した場合はサービスを再起動する必要があります。

私が見ることができる限り、私のオプションは....

  1. Linuxボックスでノードサービスを実行すると、デーモンとして実行されているときにstdoutが機能するはずです
  2. どういうわけか、Windowsサービスがstdoutを「見る」ことができるようにします
  3. サービスを監視し、失敗した場合にサービスを再起動できる別のノード サーバー (nssm で実行) を作成します。

これまでのところ、追加のホスティング ホストがあるため、可能であればオプション 1 は避けたいと考えています。オプション 2 に役立つものは何も見つかりません。Windows サービスはそのようには機能しないようです。

そこで今日、クラッシュしたサービスがハートビートに応答しない場合に再起動できる監視サービスを作成しようとしました。問題は、別のインスタンス ノード内から完全に独立したノード サーバーを起動する方法がわかりません。子プロセスを使用する場合、それはまだサービスの子プロセスであり、stdout は作業を行いません。

では、ノードで独立したプロセスを作成することは可能ですか? この問題に対処するための他の提案はありますか?

4

1 に答える 1

6

子プロセスは依然として独立したプロセスですが、デフォルトでは、stdinストリームは依然として親にアタッチされているため、親プロセスが終了すると、子も同様に終了します。これを回避するには、子プロセスを切り離して実行します。ドキュメントの例を次に示します。

var fs = require('fs');
var spawn = require('child_process').spawn;
var out = fs.openSync('./out.log', 'a');
var err = fs.openSync('./out.log', 'a');

var child = spawn('cmd', [], {
  detached: true,
  stdio: [ 'ignore', out, err ]
});

child.unref();

このchild.unref()メソッドは、イベント ループ内の子への参照を削除するためのものです。そうすれば、親は自分自身を終了するために子が終了するのを待たなくなります。また、このオプションを使用する場合でも、子のストリームと親detachedの関連付けを解除する必要があることに注意してください。そうしないと、接続されたままになります。stdin

于 2013-10-09T14:31:11.450 に答える