9

Node.js で小さな独自のゲーム サーバー マネージャーを作成しています。現在、次の方法でスポーンしてゲームを実行しますchild_process

var server = spawn(cmd, args, { cwd: 'something' });

マネージャーが実行し続ける限り、コマンドをパイプして、必要に応じて子を処理できます。ただし、マネージャーがクラッシュしたり閉じたりする可能性を考慮してください。 次に、以前に生成された子プロセス (マネージャーがダウンしている間も実行されていた) に再接続するにはどうすればよいですか? pidfile を保存して、pid に基づいて再接続を試みることができます。child_processしかし、子のオブジェクトにアクセスできるオブジェクトを取得する方法がわかりませんstdio

これが回復可能であることを本当に望んでいます。どんな助けでも大歓迎です、ありがとう!


: ゲーム サーバーはプロプライエタリです。たとえば、Minecraft、ソース DS などがあります。サーバー ソースにアクセスできないと仮定します。


編集

ノードからいくつかのソースコードを読み取った後、オプションで , というプロパティを指定した場合、またはソケットを開く必要child_processがあるように見えます。( 428496行を参照)。したがって、問題は、spawn が実際にspawn を実行するのをどのように停止し、代わりに指定された pid と渡したストリームに基づいてその値を設定するかです。(その fd はパイプとして作成されているので、どちらが機能するかを実行することで取得できます。)stdinStreamstdoutStreamstderrStreamstdinStreamfs.createWriteStream('/proc/PID/fd/0');

4

2 に答える 2

1

上記のコメントで誰かが言ったことを拡張するには、各子プロセスがサーバーを作成するhttp://nodejs.org/api/net.htmlを使用できる場合があります ( net.createServer())。マスターが再起動すると、その子のリストを見つけて、それぞれのサーバーに接続します。Socketsから取得したは、マスター内のオブジェクトを置き換えnet.createConnection()ます。child_process

netサーバーとソケットは、 と同じ Readable および Writable Streamインターフェイスを実装しているため、設定して接続した後は、これまで行ってきたようにイベントを実行できるstdioはずです。write(...)pipe()

これは最善の解決策ではないかもしれませんが、うまくいくと信じています。

于 2012-04-11T22:43:39.180 に答える
0

ノードプロジェクトの何人かと話した後、これを達成できる唯一の方法は、proc fs. おそらく、オブジェクトに似たものをモックアップして、次child_processのようなストリームを作成します。

var child = {};
child.stdin = fs.createWriteStream('/proc/PID/fd/0');
child.stdout = fs.createReadStream('/proc/PID/fd/1');
child.stderr = fs.createReadStream('/proc/PID/fd/2');
于 2012-04-23T12:37:42.693 に答える