2012-04-11 11 views
7

Estoy creando un pequeño administrador de servidores de juegos propietario en Node.js; Actualmente se ejecuta el juego por medio de desove child_process:Vinculación al proceso generado a través de nodejs

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

En tanto que el director sigue para ejecutar comandos que puede canalizar y tratar con el niño como me gustaría. Sin embargo, considere la posibilidad de que mi gerente se bloquee o se cierre. ¿Cómo podría entonces volver a conectar al proceso secundario generado anteriormente (que todavía se estaba ejecutando mientras el administrador estaba inactivo)? Puedo almacenar archivos pidf para tratar de volver a conectar en base a pid; pero no estoy seguro de cómo obtener un objeto child_process con acceso a los objetos stdio del niño.

Realmente me gustaría que esto sea recuperable; cualquier ayuda es apreciada, gracias!


Atención:: Los servidores de juego son propietarias, algunos ejemplos son Minecraft, Fuente DS, etc. asume que no tienen acceso a la fuente de Sever.


EDITAR

Después de leer algo de código fuente desde el nodo de child_process se ve como si se especifica una propiedad en las opciones de llamadas stdinStream, stdoutStream o stderrStream que sólo debe abrir un socket a la misma. (Consulte las líneas 428 - 496). Entonces el problema es, ¿cómo dejo spawn de en realidad haciendo un spawn y en su lugar solo configura sus valores en base a un pid especificado y las secuencias que paso. (Me gustaría tener mi stdinStream haciendo fs.createWriteStream('/proc/PID/fd/0'); que debería trabajar ya que se crea que fd como una tubería.)

+2

hmm. Me pregunto si podrías hacer eso en CUALQUIER lenguaje de programación, y mucho menos en js/node. Si fuera yo, echaría un vistazo al uso de sockets para resolver este – ControlAltDel

+0

Paso algunos comandos a través de 'stdin' del proceso secundario, ya que tengo poca experiencia con los zócalos * nix ¿cómo podría lograr la recuperación de un 'pipe' al 'stdin' del niño? – Chad

+0

¿Alguien tiene alguna idea sobre esto? – Chad

Respuesta

0

Después de hablar con algunos de los chicos en el proyecto del nodo, parece que la única forma en que puedo lograr esto es tratando con los descriptores de archivos sin formato en los procesos. Probablemente simularé algo similar a un objeto child_process y crearé sus secuencias como:

+0

¿Este método todavía funciona? Parece que no puedo hacer que funcione con Node v0.10. Estoy tratando de hacer un administrador de servidor de Minecraft y me gustaría obtener alguna información si tienes alguna. :) –

+0

Nunca conseguí que esto funcione al 100% en 0.6, así que abandoné el intento de hacer algo como esto desafortunadamente:/ – Chad

+0

Día triste, parece que tendré que hacer lo mismo. –

1

Para ampliar lo que alguien dijo en un comentario anterior, es posible que pueda utilizar http://nodejs.org/api/net.html, donde cada proceso hijo crea un servidor (net.createServer()) y mantienes una lista de lo que los niños están escuchando en qué puertos están en algún lugar, y luego, cuando tu master se reinicia, va y busca esa lista de niños y se conecta a cada uno de sus servidores. El Sockets que obtienes de net.createConnection() reemplaza los objetos child_process en tu maestro.

net servidores y enchufes aplicar las mismas lectura y escritura Stream las interfaces como stdio, así que después de configurar y conectar, usted debería ser capaz de write(...) y pipe() eventos como el que has estado haciendo.

Puede que esta no sea la mejor solución, pero creo que funcionará.

+0

Desafortunadamente, esto significaría hacer girar una instancia de nodo para cada servidor de juego que necesitaría ejecutar, y si alguno de esos niños falla o está cerrado, estoy en el mismo barco. – Chad

+0

Es cierto, hay muchas instancias de nodos nuevos, pero creo que engendrar también lo hizo. No entiendo si estoy en el mismo barco si uno se cuelga, por supuesto tendrá que reiniciarlo, pero de esta manera puede volver a conectarse con las cosas existentes. –

+0

Usted está hablando de tener un proc. De nodo principal proc spawn hijos nodos y comunicarse con ellos a través de sockets, que es bueno y recuperable. Pero ese * child * node proc generaría su servidor de juego y se comunicaría con él a través de 'stdin'. Entonces, si ese * niño * se bloquea, puede volver a conectarse con un niño nuevo, pero ese niño no puede volver a conectarse con el servidor del juego, que es todo el problema. Un servidor de juegos puede ser un proceso de Java, un servidor de fuente dedicada, cualquier cosa realmente. – Chad

Cuestiones relacionadas